0

N-クイーンの問題に取り組んでいます。スタックを正しく埋めるのが難しい。誰かが私にどんな指針も与えてくれることを望んでいました。

現在、私の出力は奇妙です。ノードは7つしかありませんが、「成功」ブール値が真になるには8が必要です。そして、列を増やすので、ヘッドノードは1.2になるはずだと思ったときは2,1です。

対角線もチェックする必要があることはわかっていますが、段階的に進めています。

私のconflictCheckメソッドの場合、最初に解決する必要があります。trueを返すことはありません(はい、競合があります)。何かわかったらすぐに更新します。

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

編集:

より再帰的な試みのために、コードにいくつかの変更を加えました。私の新しい出力はこれです:

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

これは進行中のコード/作業の一部です。現在、それは永遠のループに陥っています。おそらくそれから(conflictCheck)

    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);
}

}

4

1 に答える 1

0

temp != null && temp.getNext()!= null-8番目のクイーンの場合、値temp.getNext()はnullであり、出力されません。への変更:

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

編集

変更|| に &&:

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

コード queens.push(queens.size()+1, 1);では、常に2番目の引数として1を割り当てます。すべての可能性を確認する必要があります。

于 2012-03-27T06:48:27.100 に答える