【问题标题】:8 Queens puzzle algorithm not working properly8 皇后拼图算法无法正常工作
【发布时间】:2014-04-13 13:21:48
【问题描述】:

我在通过回溯实施 8 皇后问题时遇到了一些问题。我的代码不再抛出任何错误,但以某种方式找到的解决方案是错误的。这是我的代码:

public class Queens {

public int[] field = new int[8];

public static void main(String[] args) {
    new Queens();
}

public Queens() {
    initField();
    if (backtrack(0)) {
        out();
    }
}

boolean backtrack(int i) {
    while (i < 8) {
        if (danger(i)) {
            field[i] += 1;
            if (field[i] < 8) {
                return backtrack(i);
            } else {
                field[i] = 0;
                field[i - 1] += 1;
                return backtrack(i - 1);
            }
        } else {
            if (field[i] < 8) {
                if (i == 7) {
                    return true;
                } else {
                    return backtrack(i + 1);
                }
            } else {
                field[i] = 0;
                field[i - 1] += 1;
                return backtrack(i - 1);
            }
        }
    }
    return false;
}

public void initField() {
    for (int i = 0; i < 8; i++) {
        field[i] = 0;
    }
}

public boolean danger(int i) {
    for (int j = i - 1; j >= 0; j--) {
        if (field[i] == field[j]) {
            return true;
        }
        if (Math.abs(field[i] - i) == Math.abs(field[j] - j)) {
            return true;
        }
    }
    return false;
}

public void out() {
    for (int i = 0; i < 8; i++) {
        System.out
                .println("Line: " + (i + 1) + ", Field: " + (field[i] + 1));
    }
}
}

这是输出:

Line: 1, Field: 4
Line: 2, Field: 8
Line: 3, Field: 7
Line: 4, Field: 5
Line: 5, Field: 3
Line: 6, Field: 6
Line: 7, Field: 2
Line: 8, Field: 1

2 号和 3 号皇后的位置以及 7 号和 8 号皇后的位置是非法的。我已经在我的代码中搜索了错误,但恐怕我找不到任何错误。

/e: 把我的危险方法改成这样了:

public boolean danger(int i) {
    for (int j = i - 1; j >= 0; j--) {
        if (field[i] == field[j]) {
            return true;
        }
        if (Math.abs(field[i] - i) == Math.abs(field[j] - j)) {
            return true;
        }
        if(Math.abs(field[i] + i) == Math.abs(field[j] + j)) {
            return true;
        }
    }
    return false;
}

问题已回答,我仍然需要修复一些错误。_。

【问题讨论】:

  • 欢迎来到 Stack Overflow!要求人们发现代码中的错误并不是特别有效。您应该使用调试器(或添加打印语句)来隔离问题,方法是跟踪程序的进度,并将其与您期望发生的情况进行比较。一旦两者发生分歧,你就发现了你的问题。 (然后如果有必要,你应该构造一个minimal test-case。)
  • 什么是字段?女王不应该有一个 x 和一个 y 的位置吗?
  • 我使用该数组来标记 8 个皇后的位置。索引代表线条,值代表 x 值
  • 所以第1行代表x=1,字段代表y=4?
  • 我认为启发式算法会是更明智的选择。维基百科:n 个皇后

标签: java recursion backtracking n-queens


【解决方案1】:

危险的方法

(Math.abs(field[i] - i) == Math.abs(field[j] - j))

应该是

(Math.abs(field[i] - j) == Math.abs(field[j] - i))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多