【问题标题】:N-Queens, Java using LinkedList StackN-Queens,Java 使用 LinkedList 堆栈
【发布时间】:2012-03-27 00:49:55
【问题描述】:

研究 N 皇后问题。正确填充堆栈有些困难。希望有人能给我指点。

现在我的输出很奇怪..只有 7 个节点,但我的“成功”布尔值需要 8 个才能为真。头节点是 2,1,而我认为它应该是 1,2,因为我会增加列。

我知道我也需要检查对角线,但我正在逐步进行。

如果我的冲突检查方法,我需要解决的第一件事。它永远不会返回 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);
}

}

【问题讨论】:

    标签: java linked-list stack n-queens


    【解决方案1】:

    temp != null &amp;&amp; temp.getNext()!= null - 对于第 8 个皇后,值 temp.getNext() 为空且不打印。改为:

    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); 中,您始终将 1 作为第二个参数。您应该检查所有可能性。

    【讨论】:

    • 我做了一些编辑,我试图弄清楚如何处理冲突。如果存在冲突并且顶部的列是 8,您希望将其弹出并将下一个顶部的列向上移动 1。如果该列不是 8,只需将顶部的列向上移动 1 并重新检查冲突。现在,我有一个永恒的循环:/
    猜你喜欢
    • 2013-10-03
    • 1970-01-01
    • 2021-10-22
    • 2010-11-14
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    相关资源
    最近更新 更多