У меня возникли некоторые проблемы с реализацией задачи 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;
}
На вопрос дан ответ, мне все еще нужно исправить некоторые ошибки, хотя ._.