Итак, у меня есть довольно хороший код для решения судоку в 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)*/
}
}
}
}
}