Java 带回溯的数独算法不返回任何解

Java 带回溯的数独算法不返回任何解,java,tail-recursion,sudoku,backtracking,Java,Tail Recursion,Sudoku,Backtracking,我对数独算法有点迷恋,我用回溯法对它进行了编码,按照理论上的步骤,这应该是可行的,我试着调试它,但太难了(是的,它解决了一些数字并做了一些事情) 我粘贴的代码,我希望你能帮助我,我真的看不出问题在哪里 public void backtracking(int row,int col){ if(row > 8){ System.out.println("Solution Found!!"); printSudoku(); } i

我对数独算法有点迷恋,我用回溯法对它进行了编码,按照理论上的步骤,这应该是可行的,我试着调试它,但太难了(是的,它解决了一些数字并做了一些事情)

我粘贴的代码,我希望你能帮助我,我真的看不出问题在哪里

public void backtracking(int row,int col){
    if(row > 8){ 
        System.out.println("Solution Found!!"); 
        printSudoku(); 

    }
    if (m[row][col] != 0){
       next(row, col);
    }
    else {
        for(int i =1; i < n;i++) 
            if(row(row, i) && col(col, i)) {
                m[row][col] =i;
                next(row, col);
            }
        m[row][col] = 0;
    }


} 

public void next( int row, int col ) {
   if( col < 8)
       backtracking( row, col + 1 ) ;
   else
       backtracking( row+ 1, 0 ) ;
}

public boolean region(int x, int y, int numReg) {
    x = (x / 3) * 3 ;
    y = (y / 3) * 3 ;
    for( int r = 0; r < 3; r++ )
        for( int c = 0; c < 3; c++ )
        if( m[x+r][y+c] == numReg )
           return false ;

     return true ;
}

public boolean row(int x, int k){
    for(int i =0; i < 9; i++)
        if(m[x][i] == k)
            return false;
    return true;
}

public boolean col(int x, int k){
    for(int i =0; i < 9; i++)
        if(m[i][x] == k)
            return false;
    return true;
}
公共无效回溯(int行,int列){
如果(行>8){
System.out.println(“找到解决方案!!”;
数独();
}
如果(m[行][列]!=0){
下一行(行、列);
}
否则{
对于(int i=1;i

我建议使用“printSudoku”方法,它只是一个double for,你知道。

代码似乎几乎正确。 据我所知,您只是忘记调用region方法。我看不出变量n是从哪里来的。 使用此稍微修改的回溯方法进行尝试:

    public static void backtracking(int row, int col) {
    if (row > 8) {
        System.out.println("Solution Found!!");
        printSudoku();
        System.exit(0); //exiting after solution is found
    }
    if (m[row][col] != 0) {
        next(row, col);
    } else {
        for (int i = 1; i <= 9; i++) //replaced i < n with i<=9
            if (row(row, i) && col(col, i) && region(row, col, i)) { //calling region method too
                m[row][col] = i;
                next(row, col);
            }
        m[row][col] = 0;
    }

}
公共静态无效回溯(int行,int列){
如果(第8行){
System.out.println(“找到解决方案!!”;
数独();
System.exit(0);//找到解决方案后退出
}
如果(m[行][列]!=0){
下一行(行、列);
}否则{

对于(int i=1;我知道你已经读过回溯和数独的问题了,也就是说:我读过了,我的解决方案就是基于这些问题,但它不起作用……我问的不仅仅是好玩的:坐着工作!!谢谢你,但是……如果我可以的话,我还有其他问题要问你。如果数独构建得不好,我想找到所有可行的解决方案?我不能简单地删除“System.exit”行……我需要回忆“backtracking”方法吗?或者简单地修改“row”当然我想知道正确的方法是什么,而不仅仅是“this works and i don know why:P”好问题。简单地删除System.exit将不起作用,因为row是9,接下来要做的是访问m[row][col col.调用回溯(0,0)将再次打印相同的解决方案。我认为(未测试)您必须添加另一个回溯变量,该变量以不同的数字启动for循环:for(int j=n;j