为什么我的 JAVA 使用回溯法解决数独问题的代码没有给出任何解决方案?

Why is my JAVA code for solving sudoku using backtracking not giving any solution?

这是 JAVA 中的代码,用于使用回溯解决任何 9*9 数独网格的数独问题。它不打印任何输出。我找不到这个错误。请帮忙。我以 9*9 网格的形式将其中一个示例输入 int 包含在主函数中。 is_safe 函数如果通过检查同一行、同一列和相应的 3*3 网格将所选字符放在那里是安全的。基本情况在 cr 变为 9 时检查,即到达板的末端,而 cl 变为 0,即我们到达板外时。那么可能已经找到了可能的解决方案。我们在那个时候打印电路板并 return 到调用函数。逻辑上似乎是正确的,但它没有打印任何输出。

    public static boolean is_safe(int mat[][],int cr,int cl,int i)
    {
        for(int k=0;k<mat.length;k++)
        {
            if(k!=cl&&mat[cr][k]==i)
            return false;
            if(k!=cr&&mat[k][cl]==i)
            return false;
        }
        int row=cr-cr%3;
        int col=cl-cl%3;
        for(int k=0;k<3;k++)
        {
            for(int l=0;l<3;l++)
            {
                if(mat[k+row][l+col]==i)
                return false;
            }
        }
        return true;
    }
    public static void print(int mat[][])
    {
        for(int i=0;i<mat.length;i++)
        {
            for(int j=0;j<mat[0].length;j++)
            {
                System.out.println(mat[i][j]);
            }
            System.out.println();
        }
    }
    public static void func(int mat[][],int cr,int cl)
    {
        if(cr==mat.length&&cl==0)
        {
            print(mat);
            return;
        }
        int i=cr,j=cl;
        if(mat[cr][cl]!=0)
        {
            if(cl+1==9)
            func(mat,cr+1,0);
            else
            func(mat,cr,cl+1);
        }
        else{
        for(int k=1;k<=9;k++)
        {
            if(is_safe(mat,i,j,k))
            {
                mat[i][j]=k;
                if(j+1==mat.length)
                func(mat,i+1,0);
                else
                func(mat, i, j+1);
                mat[i][j]=0;
            }
        }
    }
    }
    public static void main(String[] args) {
        int mat[][]={{3,0,6,5,0,8,4,0,0},
                     {5,2,0,0,0,0,0,0,0},
                     {0,8,7,0,0,0,0,3,1},
                     {0,0,3,0,1,0,0,8,0},
                     {9,0,0,8,6,3,0,1,5},
                     {0,5,0,0,9,0,6,0,0},
                     {1,3,0,0,0,0,2,5,0},
                     {0,0,0,0,0,0,0,7,4},
                     {0,0,5,2,0,6,3,0,0}};
        func(mat,0,0);
    }
}```



您的打印方法从未被调用!看来数独无解了!

通过以下输入,您的代码可以正常工作:

{{3,0,6,5,0,8,4,0,0},
{5,2,0,0,0,0,0,0,0},
{0,8,7,0,0,0,0,3,1},
{0,0,3,0,1,0,0,8,0},
{9,0,0,8,6,3,0,0,5},
{0,5,0,0,9,0,6,0,0},
{1,3,0,0,0,0,2,5,0},
{0,0,0,0,0,0,0,7,4},
{0,0,5,2,0,6,3,0,0}};

您还可以更改打印方法以使其更具可读性:

public static void print(int mat[][]) {
    for (int i = 0; i < mat.length; i++) {
        List<String> stringList = Arrays.stream(mat[i])
                .mapToObj(String::valueOf).collect(Collectors.toList());
        System.out.println(String.join(" ", stringList));
    }
}

输出:

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