Ich bin ziemlich neu zu Codierung im Allgemeinen und ich schreibe einen rekursiven Sudoku-Löser jetzt in Java. Allerdings bekomme ich immer einen Stack Overflow Fehler und ich kann nicht für das Leben von mir herausfinden, warum.Stack Overflow Fehler in Java Rekursive Sudoku Solver
Hier ist der ganze Code. Der Fehler liegt angeblich in den verschiedenen Lösungsmethoden.
import java.util.*;
public class sudoku{
protected static int n;
protected static int[][] game;
public static boolean checkRow(int a, int b){
boolean z = true;
for(int i=0;i<n;i++){
if(i==b) continue;
else if(game[a][b]==game[a][i]){
z = false;
break;
}
}
return(z);
}
public static boolean checkColumn(int a, int b){
boolean z = true;
for(int i=0;i<n;i++){
if(i==a) continue;
else if(game[i][b]==game[a][b]){
z = false;
break;
}
}
return(z);
}
public static boolean checkBox(int a, int b){
boolean z = true;
int x = (int)Math.sqrt(n)*(int)(a/Math.sqrt(n));
int y = (int)Math.sqrt(n)*(int)(b/Math.sqrt(n));
for(int i=x;i<x+Math.sqrt(n);i++){
for(int j=y;j<y+Math.sqrt(n);j++){
if(a==i&&b==j) continue;
else if(game[a][b]==game[i][j]){
z = false;
break;
}
}
}
return(z);
}
public static boolean checkAll(int a, int b){
return(checkRow(a,b)&&checkColumn(a,b)&&checkBox(a,b));
}
public static void solvePrevious(int row, int col){
if(row==0&&col==0){
System.out.println("This game is unsolvable.");
return;
}
else if(col==0) solve(row-1,n-1,game[row-1][n-1]+1);
else solve(row,col-1,game[row][col]+1);
}
public static void solveNext(int row, int col){
if(row==n-1&&col==n-1) return;
else if(col==n-1) solve(row+1,0,1);
else solve(row,col+1,1);
}
public static void solve(int row, int col, int value){
if(value<=n){
game[row][col] = value;
if(checkAll(row,col)) solveNext(row,col);
else solve(row,col,value+1);
}
else solvePrevious(row,col);
}
public static void main(String[] args){
Scanner inp = new Scanner(System.in);
System.out.println("What is the side length of the puzzle?");
n = 0;
do{
n = inp.nextInt();
if(Math.sqrt(n)%1!=0) System.out.println("The side length must be a perfect square.");
}while(Math.sqrt(n)%1!=0);
game = new int[n][n];
solve(0,0,1);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.print(game[i][j]+" ");
}
System.out.println(" ");
}
}
}
Ihr Programm rekursiert zu oft und verbraucht den gesamten verfügbaren Stapelspeicherplatz. http://stackoverflow.com/questions/214741/what-is-a-stackoverflowerror – NAMS
Können Sie das gesamte Programm posten? Das würde es für uns einfacher machen, es auszuführen und zu überprüfen, ob unsere Hinweise und Tipps nützlich sind. –
Ich weiß, was ein Stack Overflow Fehler ist, aber ich kann nicht herausfinden, wo. Wiederholt es sich nur zu oft? Oder gibt es irgendwo eine unendliche Rekursion? @Roland Sicher. Momentan ist es nur zum Lösen eines leeren Sudoku-Boards, aber später werde ich es ändern, um ein Board mit voreingestellten Zellen zu lösen. – NQ2Resq