Алгоритм головоломки 8 королев не работает должным образом

У меня возникли некоторые проблемы с реализацией задачи 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;
}

На вопрос дан ответ, мне все еще нужно исправить некоторые ошибки, хотя ._.


person user3529034    schedule 13.04.2014    source источник
comment
Добро пожаловать в Stack Overflow! Просить людей выявлять ошибки в вашем коде не особенно продуктивно. Вы должны использовать отладчик (или добавить операторы печати), чтобы изолировать проблему, отслеживая ход выполнения вашей программы и сравнивая его с тем, что вы ожидаете. Как только они расходятся, вы нашли свою проблему. (И затем, если необходимо, вы должны создать минимальный тестовый пример.)   -  person Oliver Charlesworth    schedule 13.04.2014
comment
Что такое поле? Разве не должно быть положение x и y для ферзя?   -  person CodeCamper    schedule 13.04.2014
comment
Я использую этот массив для обозначения позиций 8 ферзей. Индексы представляют строки, а значение представляет значение x.   -  person user3529034    schedule 13.04.2014
comment
Итак, строка 1 представляет x = 1, а поле представляет y = 4?   -  person CodeCamper    schedule 13.04.2014
comment
Я думаю, что эвристика была бы более разумным выбором. Википедия: n королев   -  person shortCircuit    schedule 13.04.2014


Ответы (1)


метод опасности

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

должно быть

(Math.abs(field[i] - j) == Math.abs(field[j] - i))
person Lukáš Rutar    schedule 13.04.2014