-4

我想使用回溯生成一个简单的数独生成器。我被卡住了/不知道我是否正确使用了回溯。zahlIstGueltigAufPosition如果数字zahl有效则返回(如果 zahl 在行/列或 9 个框之一中出现一次)。

public static boolean fuelleArray(int y, int x, int zahl){

    sudokuArray[y][x]=zahl;


    if(zahlIstGueltigAufPosition(y,x,zahl)){

        if(x==8 && y<=7 && fuelleArray(y+1,0,1)){
            return true;

        }else if(x==8 && y==8 && fuelleArray(y,x,zahl)) {
            return true;

        }else if(x<=7 && y<=8){
            if(fuelleArray(y,x+1,1)) {
                return true;
            }
       }
    }else{
        if(zahl<9 && x<=8 && y<=8 ){fuelleArray(y,x,zahl+1);}
    }

    return false;
}

该计划给出:

 1 2 3 4 5 6 7 8 9
 4 5 6 1 2 3 9 0 0
 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0

谢谢你的帮助

4

1 回答 1

0

所以这是我的解决方案,有更好的方法可以使用回溯来生成数独,比如调用fuelleArray(fieldIndex, numberInField)。这样,回溯在代码中将更加明显和清晰,并且您不必像我一样处理连续结束的情况。

public static boolean fuelleArray(int y, int x, int zahl){

    sudokuArray[y][x]=zahl;

    if(zahlIstGueltigAufPosition(y,x,zahl)){
                                       //#1
        if(x==8 && y<=7){              //if you aren't at the end
            if(fuelleArray(y+1,0,1)){  //look if the the next field
                return true;           //is correct
            }
                                       //#2
        }else if(x==8 && y==8){        //if I am at the end 
            return true;               //return true, cause at 
                                       //zahlIstGueltigAufPosition
                                       //we know its correctly plassed               
                                       //by the SudokuRules


        }else if(x<=7 && y<=8){        //Just like #1, but there it
            if(fuelleArray(y,x+1,1)){  //was to handle the end of a 
                return true;           //row

            }
        }
    }

    if(zahl<9 && x<=8 && y<=8 ){      //if we are not correct we
        if(fuelleArray(y,x,zahl+1)){  //increase the number in that
            return true;              //field

        }
    }else {                           //if we are at number 9 we put 
        sudokuArray[y][x]=0;          //put it back to zero
                                      //
    }                                 //
    return false;                     //and return false

}
于 2018-01-24T22:39:55.727 回答