【问题标题】:Java Sudoku Squares 3x3 Checking ValidityJava Sudoku Squares 3x3 检查有效性
【发布时间】:2014-03-30 17:05:35
【问题描述】:

我正在开发一个 Java 程序来检查数独谜题是否已解决。我已经完成了水平和垂直数字检查部分。但是当试图检查方块时,我什么也做不了。这是我的支票系统的工作原理。

这就是我想做的。希望有人能帮上忙,因为我在使用方形检查时遇到了困难。

int[][] SudokuBoard = new int[9][9];
// I didn't wrote the sudoku board completely hope you understood how sudoku table looks like.

public static boolean checkSquares(int[][] SquareBoard) {
    int retr = false;
    int loop = 0;
    int[] extraboard = new int[9];
    int[] truelist ={1,2,3,4,5,6,7,8,9};

    for(int i = 1; i <=9 ; I++) {
        //here , extraboard will have the numbers in " i " numbered sudoku square.( i is like first //,second)
        Arrays.sort(extraboard);
        for(int j = 0; j < 9; j++) {
            if(extraboard[j] == truelist[j])
                loop += 1;
        }
        extraboard = new int[9];
    }

    if(loop == 81)
        retr == true;

    return retr;
}

【问题讨论】:

  • 你能等一下,我正在编辑代码
  • 3x3 数独有多少个方格? 4?
  • 好吧,暂时忽略这显然无法编译,采用行/列/3x3 正方形并对其进行排序的想法非常好。这不是我自己会做的,但它应该工作。你只是遗漏了一些细节。
  • 不,我想说这是一个普通的 9x9 数独板,每个方格都是 3x3,就像土耳其语中的每个数独一样,普通数独 9 tane 3x3 kare olur içindeki sayılar da 1-9 arası olur ya。
  • 因为在数独中每个方格都是 3x3,不是大方,小方。

标签: java arrays sorting multidimensional-array


【解决方案1】:

你可以的

int count = 0;
for(int k = 0; k < 9; k++) {
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 3; j++) {
            extraboard[count++] = SquareBoard[i+3*k/3][j+k%3*3];
        }    
    }
    Arrays.sort(extraboard);
    for(int j = 0; j < 9; j++) {
        if(extraboard[j] == truelist[j])
            loop += 1;
    }
    extraboard = new int[9];
    count = 0;
}

计算框中位置的实际公式非常简单。由于板子是分行列的,所以获取行列的位置需要根据整个区域中box的位置来获取偏移量。

i 这里计算行框内的索引。由于在 9x9 数独中每行盒子的长度为 3,我们需要在每次放入 3 个盒子时将行数增加 3。要计算出并仅添加 3,我们可以使用一些整数除法。

例如:

i+i.length*k/i.length

这显然是一个语法错误,因为 i 没有长度,但可以将其视为循环中 i 的限制(在本例中为 3)。

然后这将获取框中的当前行(第一个 i)并将其添加到 sudoki 中框的偏移量。也就是说,每 3 个框 k/i.length 就多 1 个,然后我们将其乘以 3 得到偏移量 3。

在列部分我们有一个更大的问题,因为我们需要在数组中向左移动每 3 个偏移它,并在我们回到最左边的框时重置它。

所以论坛会变成

j + (k%i.length)*j.length

这将为我们提供我们所在框中的列,然后我们用 k%i.length 偏移框位置。我们使用 i.length 而不是 j.length 的原因是我们需要按行计算偏移量,然后按框列的长度进行偏移。

有了它,您就可以将它应用到任何尺寸的板上。 2x2、2x3、3x2、3x3 甚至更大。

【讨论】:

    【解决方案2】:
    public static boolean checkSquares(int[][] SquareBoard) {
        int i=0, extraboard=0;
        for (;i<9;i++,extraboard=0) {
           for (int j=0;j<9;j++)
               extraboard+=1<<(SquareBoard[i/3*3+j/3][i%3*3+j%3]-1);
           if (extraboard!=(1<<9)-1) // 511, binary(511) = 111111111
               break;
        }
        return i==9;
    }
    

    【讨论】:

    • 是的,它说我没有初始化
    • 我修复了初始化 i = 0 和 extraboard=0。这是我复制到这里后的编辑。
    • 我刚刚编译它没有语法错误。请最后确认
    • 代码可以运行,但没有给出真实的结果。它说数独没有解决。但是数独解决了。我认为数字有一点错误
    • 没问题,非常感谢你教我&lt;&lt;运算符的一些用法。
    猜你喜欢
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2014-07-28
    • 1970-01-01
    • 2020-11-15
    • 2012-12-30
    相关资源
    最近更新 更多