数独解算器Java(不像其预期的那样工作)

数独解算器Java(不像其预期的那样工作),java,arraylist,sudoku,Java,Arraylist,Sudoku,我正在尝试用java制作一个数独解算器,但它似乎不起作用。 我的目的是用包含可能的解决方案的整数数组填充二维数组列表。因此,对于每个单元格,它都会检查可以放入该单元格的数字。它检查行、列及其所在的正方形。如果只有一个可能的解决方案,那么这将作为最终答案。代码应该一直运行,直到所有整数数组的大小都为1为止,即它们达到最终答案。 这是我的密码: import java.util.ArrayList; import java.util.Scanner; import stat

我正在尝试用java制作一个数独解算器,但它似乎不起作用。 我的目的是用包含可能的解决方案的整数数组填充二维数组列表。因此,对于每个单元格,它都会检查可以放入该单元格的数字。它检查行、列及其所在的正方形。如果只有一个可能的解决方案,那么这将作为最终答案。代码应该一直运行,直到所有整数数组的大小都为1为止,即它们达到最终答案。 这是我的密码:

    import java.util.ArrayList;
    import java.util.Scanner;

    import static sun.security.krb5.Confounder.intValue;

    public class SudokuBoard {
public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    ArrayList<ArrayList<ArrayList<Integer>>> col = new ArrayList<ArrayList<ArrayList<Integer>>>();
    int[] possible = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    for (int i = 1; i < 10; i++) {
        ArrayList<ArrayList<Integer>> row = new ArrayList<ArrayList<Integer>>();
        for (int j = 0; j < 9; j++) {
            ArrayList<Integer> nums = new ArrayList<Integer>();
            Integer integer = /**(int) (Math.random() * 10);*/scan.nextInt();
            nums.add(integer);
            row.add(nums);
        }
        col.add(row);
    }
    printArray(col);
    boolean step = true;

    ArrayList<ArrayList<ArrayList<Integer>>> place = new ArrayList<ArrayList<ArrayList<Integer>>>();
    for (int i = 1; i < 10; i++) {
        ArrayList<ArrayList<Integer>> row = new ArrayList<ArrayList<Integer>>();
        for (int j = 0; j < 9; j++) {
            ArrayList<Integer> nums = new ArrayList<Integer>();
            Integer integer = 0;
            nums.add(integer);
            row.add(nums);
        }
        place.add(row);
    }
    int count = 0;
    while(step) {
        count++;
        System.out.println(count);
        step = false;
        for (int h = 0; h < col.size(); h++) {                   //main logic for the code
            for (int k = 0; k < col.get(h).size(); k++) {
                boolean canAdd = false;
                if (col.get(h).get(k).get(0).intValue() == 0) {
                    ArrayList<Integer> last = new ArrayList<Integer>();
                    for (int i = 1; i < 10; i++) {
                        ArrayList<Integer> left = toCompare(col, "h", h);
                        ArrayList<Integer> down = toCompare(col, "v", k);
                        ArrayList<Integer> square = toCompare(col, h, k);
                        boolean inL = false;
                        boolean inD = false;
                        boolean inS = false;
                        for (int j = 0; j < left.size(); j++) {
                            if (i == left.get(j).intValue()) {
                                inL = true;
                            }
                        }
                        for (int j = 0; j < down.size(); j++) {
                            if (i == down.get(j).intValue()) {
                                inD = true;
                            }
                        }
                        for (int j = 0; j < square.size(); j++) {
                            if (i == square.get(j).intValue()) {
                                inS = true;
                            }
                        }
                        if (!inL && !inD && !inS) {
                            last.add(i);
                            canAdd = true;
                        }
                    }
                    if(canAdd){
                        //last.add(0);
                        col.get(h).set(k, last);}
                    if(col.get(h).get(k).size() != 1 )//|| col.get(h).get(k).get(0).intValue() == 0)
                    {
                        step = true;
                    }
                }
            }
        }
    }
    System.out.println();
    printArray(col);
    System.out.println(count);


}

public static ArrayList<Integer> toCompare(ArrayList<ArrayList<ArrayList<Integer>>> list, String type, int row) {
    ArrayList<Integer> ints = new ArrayList<Integer>();
    if (type.equals("h")) { // Checks the horizontal for used numbers
        for (int i = 0; i < list.size(); i++) {
            if (/**list.get(row).get(i).size() == 1 && */list.get(row).get(i).get(0).intValue() != 0) {
                ints.add(list.get(row).get(i).get(0));
            }
        }
    } else if (type.equals("v")) {//checks the vertical for used numbers
        for (int i = 0; i < list.size(); i++) {
            if (/**list.get(i).get(row).size() == 1 &&*/ list.get(i).get(row).get(0).intValue() != 0) {
                ints.add(list.get(i).get(row).get(0).intValue());
            }
        }
    }
    return ints;
}

public static ArrayList<Integer> toCompare(ArrayList<ArrayList<ArrayList<Integer>>> list, int row, int col) {
    int c = (int) (col / 3); //checks the square for used numbers.
    int r = (int) (row / 3);
    ArrayList<Integer> ret = new ArrayList<Integer>();
    for (int i = r; i < r + 3; i++) {
        for (int j = c; j < c + 3; j++) {
            if (list.get(i).get(j).get(0).intValue() != 0/** && list.get(i).get(j).size() == 1*/) {
                ret.add(list.get(i).get(j).get(0).intValue());
            }
        }
    }
    return ret;
}

public static void printArray(ArrayList<ArrayList<ArrayList<Integer>>> col) { //prints out the array.
    for (int i = 0; i < col.size(); i++) {
        for (int j = 0; j < col.get(i).size(); j++) {
            System.out.print("" + (col.get(i).get(j).get(0).intValue()));
            System.out.print("  ");
        }
        System.out.println();
    }
  }
}
import java.util.ArrayList;
导入java.util.Scanner;
导入静态sun.security.krb5.confour.intValue;
公共级数独板{
公共静态void main(字符串[]args){
扫描仪扫描=新扫描仪(System.in);
ArrayList col=新的ArrayList();
int[]可能={1,2,3,4,5,6,7,8,9};
对于(int i=1;i<10;i++){
ArrayList行=新的ArrayList();
对于(int j=0;j<9;j++){
ArrayList nums=新的ArrayList();
整数=/**(int)(Math.random()*10);*/scan.nextInt();
加法(整数);
行。添加(nums);
}
列添加(行);
}
打印阵列(col);
布尔步长=真;
ArrayList place=新的ArrayList();
对于(int i=1;i<10;i++){
ArrayList行=新的ArrayList();
对于(int j=0;j<9;j++){
ArrayList nums=新的ArrayList();
整数=0;
加法(整数);
行。添加(nums);
}
添加(行);
}
整数计数=0;
while(步骤){
计数++;
系统输出打印项次(计数);
步骤=假;
对于(inth=0;h
我不是那么有经验,我也试过调试它。但是,它不会像预期的那样工作

我已经在网上看到了关于如何做到这一点的代码,但我认为用自己的方式学习更好


感谢所有的帮助

到底出了什么问题?你有错误吗?你没想到它在做什么?嗨,对不起,我没说清楚。没有错误,只是解决不了问题。我认为逻辑是正确的,但实现可能是错误的。您提供了什么输入?你期望什么样的产出?你得到了什么输出?扫描仪扫描我从互联网上得到的一个真正的数独问题(它有解决方案),然后它试图解决它,但不是所有的问题