Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数独解答检查器_Java_Artificial Intelligence_Sudoku - Fatal编程技术网

Java 数独解答检查器

Java 数独解答检查器,java,artificial-intelligence,sudoku,Java,Artificial Intelligence,Sudoku,我有一个Java程序,可以检查数独是否有效,我有两种方法,第一种是检查所有列、子网格、行的和,然后判断是否为45,第二种是检查所有数独的和是否为405,如果是,那么数独是有效的,所以我在寻找一个反例,在输入中,我有一个有效的数独,但程序告诉我这是无效的,所以代码如下: public class test_checker { static final boolean valide=true; static final boolean non_valide=false; /

我有一个Java程序,可以检查数独是否有效,我有两种方法,第一种是检查所有列、子网格、行的和,然后判断是否为45,第二种是检查所有数独的和是否为405,如果是,那么数独是有效的,所以我在寻找一个反例,在输入中,我有一个有效的数独,但程序告诉我这是无效的,所以代码如下:

public class test_checker {
    static final boolean valide=true;
    static final boolean non_valide=false;

    // verify every sub-grid if it is valid
        static boolean check_subgrid(int a[][],int ei,int ej){
            int sum=0;
            for(int i=ei;i<ei+3;i++){           
                for(int j=ej;j<ej+3;j++){
                    sum=sum+a[j][i];
                }
            }
            if(sum!=45) return non_valide;
            else return valide;
        }
        //verify a sudoku by sum of every row & column & sub-grid
        static boolean Checker1(int a[][]){
            int sum=0;
            //check row
            for(int i=0;i<9;i++){
                sum=0;
                for(int j=0;j<9;j++){
                    sum=sum+a[i][j];
                }
                if(sum!=45) return non_valide;

            }
            //check column
            for(int i=0;i<9;i++){
                sum=0;
                for(int j=0;j<9;j++){
                    sum=sum+a[j][i];
                }
                if(sum!=45) return non_valide;
            }       
            //check sub-grid
            for(int i=0;i<9;i=i+3){
                for(int j=0;j<3;j=j+3){
                    if(check_subgrid(a,i,j)==non_valide) return non_valide;
                }
            }
            return valide;
        }
        //verify by sum of all sudoku  
        static boolean Checker2(int a[][]){
            int sum=0;
            for(int i=0;i<9;i++){           
                for(int j=0;j<9;j++){
                    sum=sum+a[i][j];
                }
            }   
            if(sum!=405) return non_valide;
            else return valide;
        }


    public static void main(String[] args) {
        int [][] sudoku =
            {
                {1,2,3,4,5,6,7,8,9},
                {4,5,6,7,8,9,1,2,3},
                {7,8,9,1,2,3,4,5,6},
                {3,1,2,9,7,8,6,4,5},
                {6,4,5,3,1,2,9,7,8},
                {9,7,8,6,4,5,3,1,2},
                {2,3,1,5,6,4,8,9,7},
                {5,6,4,8,9,7,2,3,1},
                {8,9,7,2,3,1,5,6,4}
            };
        if(Checker1(sudoku)) System.out.println("it's valide (checker1)!");
        else System.out.println("it's not valide !");
        if(Checker2(sudoku)) System.out.println("it's valide (checker2) !");
        else System.out.println("it's not valide !");

    }

}

正如约翰·博林格所说

你应该问的是,是否有一个无效的9乘9网格 然而,它确实满足您的标准

我想到的最简单的两个例子是:

{5,5,5,5,5,5,5,5,5},
{5,5,5,5,5,5,5,5,5},
{5,5,5,5,5,5,5,5,5},
{5,5,5,5,5,5,5,5,5},
{5,5,5,5,5,5,5,5,5},
{5,5,5,5,5,5,5,5,5},
{5,5,5,5,5,5,5,5,5},
{5,5,5,5,5,5,5,5,5},
{5,5,5,5,5,5,5,5,5}
在你的例子中,你可以把0代替1
10而不是9。确保每个字段在行、列和子网格中是不同的,并且间隔为[1,9]。

对于checker2,您可以将两行的两个值反转。在这里,我颠倒了第一行和第二行中的4和1,显然这是一个无效的数独,但是checker2会给你一个肯定的结果

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

你不应该检查数字的总和,因为它可能有误报,重复的数字也和45。你应该检查数字是否重复。这个问题更适合你吗?当然,没有有效的9x9数独不能满足你的标准。它直接来源于有效数独的定义。你应该问的问题是,是否有一个9乘9的无效网格仍然满足你的标准。@Hugo,你确定吗!给我一个数独解的反例,它是正确的,我的程序告诉我它是无效的,绝对有网格的元素总和是405,但那不是有效的数独。第一种方法是否也被打破是一个更难的问题。