Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.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,4x4数独的有效方式_Java - Fatal编程技术网

数独java,4x4数独的有效方式

数独java,4x4数独的有效方式,java,Java,我正在制作一个数独程序,我已经建立了2D数组来表示4x4网格状的数独: int getNumber (String str) { if (str.equals ("")) { return 0; } return Integer.parseInt (str); } int[][] sudoku = new int [4][4]; sudoku[0][0] = getNumber(t1.ge

我正在制作一个数独程序,我已经建立了2D数组来表示4x4网格状的数独:

    int getNumber (String str) 
    {

     if (str.equals ("")) 
    {
        return 0;
    } 

    return Integer.parseInt (str);
    } 

    int[][] sudoku = new int [4][4];


    sudoku[0][0] = getNumber(t1.getText());
    sudoku[1][0] = getNumber(t2.getText());
    sudoku[2][0] = getNumber(t5.getText());
    sudoku[3][0] = getNumber(t6.getText());
    sudoku[0][1] = getNumber(t3.getText());
    sudoku[1][1] = getNumber(t4.getText());
    sudoku[2][1] = getNumber(t7.getText());
    sudoku[3][1] = getNumber(t8.getText());
    sudoku[0][2] = getNumber(t9.getText());
    sudoku[1][2] = getNumber(t10.getText());
    sudoku[2][2] = getNumber(t13.getText());
    sudoku[3][2] = getNumber(t14.getText());
    sudoku[0][3] = getNumber(t11.getText());
    sudoku[1][3] = getNumber(t12.getText());
    sudoku[2][3] = getNumber(t15.getText());
    sudoku[3][3] = getNumber(t16.getText());
所以,我的观点是,你知道如何在水平方向上,垂直方向上,和盒子上有相同的数字(在这个例子中是2x2)。因为我不想写一堆if语句,将一个索引和另一个索引进行百次比较。也许你们可以帮我做一个循环,比较垂直、水平和正方形。我打算把数独做成这样:

 [][] [][]
 [][] [][]

 [][] [][]
 [][] [][]      
 //each square representing a spot for number(4x4 sudoku)

在我看来,如果使用一维数组而不是二维数组,算法会变得更简单。不管数据结构如何,都可以将其打印为表

使用Java 8,可能的解决方案如下所示:

private static final int SIZE = 4;
private static final int BOX = 2;
private int[] sudoko = new int[SIZE * SIZE];

private boolean hasDuplicate(int pos) {
    int value = sudoko[pos];
    return IntStream.range(0, SIZE * SIZE)
        .filter(p -> p != pos)
        .filter(p -> sameRow(p, pos) || sameCol(p, pos) || sameBox(p, pos))
        .anyMatch(p -> sudoko[p] == value);
}

private boolean sameRow(int pos1, int pos2) {
    return pos1 / DIM == pos2 / DIM;
}

private boolean sameCol(int pos1, int pos2) {
    return pos1 % DIM == pos2 % DIM;
}

private boolean sameBox(int pos1, int pos2) {
    return pos1 / SIZE / BOX == pos2 / SIZE / BOX && pos1 % SIZE / BOX == pos2 % SIZE / BOX;
}
可以对2D数组使用相同的算法,但需要比
IntStream
更复杂的算法