【问题标题】:why is my code endlessly testing (n queens problem / java / blue)为什么我的代码无休止地测试(n 皇后问题 / java / blue)
【发布时间】:2020-07-19 16:49:00
【问题描述】:

所以我目前正在研究 n 个皇后问题的算法,我认为我已经完成了,但是当我运行一个 junit 类来测试代码时,它只是无休止地工作。

蓝条只是从左到右无休止地移动,依此类推(https://prnt.sc/ruqjef

我不太清楚为什么会这样。 junit 类正在测试 n=8 的代码。当我尝试使用 n=1 时,它的工作,当我尝试使用 n>=2 时,它只是加载/工作。

我不知道为什么,所以我真的很感激一些帮助 c:

我的代码:

public class Damenproblem {

    /**
     * Datenstruktur für das Speichern der Damenpositionen
     * als Array-Attribut der Klasse
     */
    private boolean[][] damenFeld;

    /**
     * Gibt ein zweidimensionales boolean-Array zurueck. 
     * n ist die Schachbrettbreite. Auf den jeweiligen
     * Positionen des Arrays sind die Positionen der Damen (true = Dame, false =
     * keine Dame). Wenn sich das Problem nicht loesen laesst, wird eine
     * NoSolutionException geworfen.
     */
    public boolean[][] damen(int n) throws NoSolutionException{
        this.damenFeld = new boolean[n][n];
        if (setze(0)){
            return damenFeld;
        }
        else {
            throw new NoSolutionException();
        }
    }

    /**
     * Backtracking-Algorithmus
     * Parameter dameNr gibt die laufende Nummer der zu setzenden Dame an.
     */
    private boolean setze(int dameNr) {
        int zeile = 0;
        if(dameNr == damenFeld.length) {
            return true;
        } else {
        for(dameNr = 0; dameNr <= damenFeld.length; dameNr++) {

            if(erlaubt(dameNr, zeile)) {
                damenFeld[dameNr][zeile] = true;
                if(setze(dameNr+1)) {
                    return true;
                } else {
                    damenFeld[dameNr][zeile] = false;
                    zeile += 1;
                }
            }
        }
        return false;
    }
    }
    // DameNr ist die Spalte
    public boolean erlaubt(int spalte, int zeile) {
        // check horizontal and vertical
        int tempSpalte = spalte;
        int tempZeile = zeile;
        for(int i = 0; i < damenFeld.length; i++) {
            if(damenFeld[i][zeile] || damenFeld[spalte][i]) {
                return false;
            }
        }
        // check diagonal
        // to upper right
        while(spalte >= 0 && spalte <= damenFeld.length && zeile >= 0 && zeile <= damenFeld.length){
            spalte = tempSpalte;
            zeile = tempZeile;
            if(damenFeld[spalte][zeile]) {
                return false;
            }
            spalte += 1;
            zeile -= 1;
        }
        // check diagonal
        // to lower right
        while(spalte >= 0 && spalte <= damenFeld.length && zeile >= 0 && zeile <= damenFeld.length){
            spalte = tempSpalte;
            zeile = tempZeile;
            if(damenFeld[spalte][zeile]) {
                return false;
            }
            spalte += 1;
            zeile += 1;
        }
        // check diagonal
        // to lower left
        while(spalte >= 0 && spalte <= damenFeld.length && zeile >= 0 && zeile <= damenFeld.length){
            spalte = tempSpalte;
            zeile = tempZeile;
            if(damenFeld[spalte][zeile]) {
                return false;
            }
            spalte -= 1;
            zeile += 1;
        }
        // check diagonal
        // to upper left
        while(spalte >= 0 && spalte <= damenFeld.length && zeile >= 0 && zeile <= damenFeld.length){
            spalte = tempSpalte;
            zeile = tempZeile;
            if(damenFeld[spalte][zeile]) {
                return false;
            }
            spalte -= 1;
            zeile -= 1;
        }
        return true;
    }
}

【问题讨论】:

  • setze() 中这看起来不对:for(dameNr = 0; dameNr &lt;= damenFeld.length; dameNr++) 这与传递的参数同名,您不是这样丢失值吗?我想你把dameNrzeile 的意思颠倒了。
  • 是的,我刚刚意识到。我将 dameNr=0 更改为 i=0

标签: java recursion backtracking bluej


【解决方案1】:

为了不覆盖 dameNr 参数,方法 setze() 中的 for 循环应如下所示:

for(zeile = 0; zeile < damenFeld.length; zeile++)

您的 erlaubt() 检查是主要问题。我建议使用 for 而不是 while 循环,每个循环都定义了新的临时参数。否则,您将继续一遍遍地使用您传递的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多