だから私はJavaの数独ソルバーのかなり良いコードだと思うものを持っていますが、この方法で助けが必要です。メインメソッドに埋め込むと、スタックオーバーフローが発生します。問題は、私の方法が方向転換して間違いを修正する方法を知らないことです。ブール値のフラグ (以下のコードで使用されているものとは異なり、実際にはうまく機能するフラグ) または、いつ引き返す必要があるか、いつ再び前進してゲームを解決し続けることができるかを知らせる何かが必要です。あなたが与えることができる助けをありがとう
public void play(int r, int c){//this method throws the StackOverflowError
if(needAtLoc(r,c).size()==9){
int num=1+generator.nextInt(9);
setCell(r,c,num,this);
if(c<8){
System.out.println(this);///////////////
play(r, c+1);
}
else{
play(r+1, 0);
}
}
else{
if(needAtLoc(r,c).size()==0){//no possible moves THIS IS THE PROBLEM LINE!!!
if(c>0){
play(r, c-1);//play last cell, in column to left
}
else{
if(r==0){
play(r,c);//first square, so must play again (can't go back)
}
else{
play(r-1, 8);/*first cell of row so must go to previous row and
the end column*/
}
}
}
else{//if there are possible moves
int num=needAtLoc(r,c).remove(generator.nextInt(needAtLoc(r,c).size()));
setCell(r,c,num,this);//set the value of the cell
System.out.println(this);//////////////
if(r==8 && c==8){//the end of the cell has been reached so must end recursive call
return;
}
else{
if(c<8){
play(r, c+1);//normal, next cell
}
else{
play(r+1, 0);/*last cell in row so we go to next one
in the first column ("return" button)*/
}
}
}
}
}