N-Queens, Java с использованием стека LinkedList - PullRequest
0 голосов
/ 27 марта 2012

Работа над проблемой N-королев. Трудно правильно заполнить стек. Надеюсь, что кто-нибудь может дать мне какие-либо указатели.

Прямо сейчас мой вывод странный .. Всего 7 узлов, но мой логический «успех» требует 8, чтобы это было правдой. И головной узел равен 2,1, когда я подумал, что это должно быть 1,2, так как я буду увеличивать столбец.

Я знаю, что мне нужно проверить диагональ, но я делаю это шаг за шагом.

Первое, что мне нужно отработать, если у меня конфликтный метод. Это никогда не возвращает истину (потому что, да, есть конфликт). Я скоро обновлюсь, если что-нибудь выясню.

Hurray
8, 1
7, 1
6, 1
5, 1
4, 1
3, 1
2, 1

EDIT:

Я внес некоторые изменения в код для более рекурсивной попытки. Мой новый вывод такой:

The stack
1, 1

End of stack
Pushing next node
The stack
2, 1
1, 1

End of stack
Moving over one column
The stack
2, 2
1, 1

End of stack
problem
Moving over one column
The stack
2, 3
1, 1

End of stack

Это часть кода / незавершенного производства. Прямо сейчас он работает в вечном цикле, скорее всего, из-за того, что в то время как (конфликта контроля)

    public static boolean conflictCheck() {
    QueenNode temp = head;
    //walk through stack and check for conflicts

    while(temp!=null) {
        //if there is no next node, there is no conflict with it
        if (temp.getNext() == null){
            System.out.println("No next node");
            if (queens.size() < 8 ) {
                return false;
            }
        }
        else if (temp.getRow() ==temp.getNext().getRow() || temp.getColumn() == temp.getNext().getColumn() ||
                diagonal(temp, temp.getNext())){
            return true;
        }
    }
    return false;
}

public static void mover(QueenNode n) {
    System.out.println("Moving over one column");

        n.setColumn(n.getColumn()+1);

    queens.viewPieces();
}

public static void playChess(int k, int total) {
    QueenNode temp= head;
    while (temp != null) {
        System.out.println("Pushing next node");

        queens.push(k,1);
        queens.viewPieces();
        //success
        if(k == 8){
            System.out.println("Hurray");
            success = true;
            return;
        }
        //conflict between pieces, loops through entire board
        while (conflictCheck()) {
            if (head.getColumn() != 8) {
                mover(head);
            }
            else {
                queens.pop();
                mover(head);
            }
        }

        playChess(k+1, total);                  
    }
}

public static void main(String[] args) {
    queens.push(1, 1);
    queens.viewPieces();
    success = false;
    playChess(2, total);
}

}

1 Ответ

0 голосов
/ 27 марта 2012

temp != null && temp.getNext()!= null - для восьмой ферзя значение temp.getNext () равно нулю и не печатается.Изменить на:

while (temp != null ) {
                System.out.println(temp.getRow() + ", " + temp.getColumn());
                temp = temp.getNext();
            }

Изменить

Изменить ||to &&:

if (temp.getRow() != temp.getNext().getRow() &&
                temp.getColumn() != temp.getNext().getColumn()) {
            return false;
        }

В коде queens.push(queens.size()+1, 1); вы всегда назначаете 1 в качестве второго аргумента.Вы должны проверить все возможности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...