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

时间:2020-01-10 21:49:55

标签: java backtracking sudoku

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

    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);
    }
}```



1 个答案:

答案 0 :(得分:1)

永远不会调用您的打印方法!似乎数独无法解决!

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

{{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