0

你好,我正在研究一个数独检查器,它可以验证完成的电路板的解决方案是否正确。我目前对如何在块内进行检查感到困惑。现在我有一个布尔值如下,我检查左上块(Block1)。我不确定将其设置为哪些参数以及如何成功运行这两个 for 循环。

问题是我想检查一个 2d 数组的一部分,它也压缩成 3x3 正方形,看看该区域中的整数是否不重复,只有 1-9 出现一次。我有类似的代码,我在其中编写了这个代码来检查一行是否有重复的整数和一列。

static boolean isBlock1Valid(int[][] sudokuBoard, int referenceRow, int referenceColumn)
{

    for(int i =0; i<2;i++){
        for(int j=0; j<2; j++){
            if(sudokuBoard[i][j]==sudokuBoard[i][j])
                return false;
        }
    }
    return true;
}//end of isBlock1Valid

这是我用作制作块检查器的参考的行检查器

       static boolean IsValidRow(int[][] sudokuBoard, int referenceRow, int width)
{
    //Compare each value in the row to each other
    for(int i = 0; i < width; i++)
    {
        for(int j = i+1; j < width; j++)
        {

            if(sudokuBoard[referenceRow][i] == sudokuBoard[referenceRow][j])
                return false;

        }
    }

    return true;
}
4

4 回答 4

3

因为这是家庭作业,所以只是一个提示。模 3 ( i % 3) 和整数除以 3 ( i / 3) 可用于将坐标 0 .. 8 分成 3 部分并在该部分中索引。

于 2012-02-16T21:17:47.300 回答
0

我不太确定你想让你给代码做什么。但是这个方法总是会返回 false。

如果您想确保一个块中每个元素只有一个实例。然后一个解决方案是有一个清单:

boolean[] seen = new boolean[9];

for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++)
        if (seen(sudokuBoard[referenceColumn+i][referenceRow+j])) return false;
        else seen[sudokuBoard[referenceColumn+i][referenceRow+j]) = true;
return true;
于 2012-02-16T21:14:42.920 回答
0

在您的IsValidRow方法中,您使用了两个嵌套循环。第一个循环遍历整行,第二个循环遍历行的其余部分以检查值是否重复。在您的 isBlock1Valid 方法中,您还使用了两个嵌套循环。但是现在您使用外环作为 y 坐标,使用内环作为 x 坐标。他们一起做你的第一个循环所做的事情IsValidRow。循环整个细胞组。您仍然必须实现第二个循环,该循环遍历盒子的其余部分。不幸的是,这对于嵌套循环并不容易。但就像 Joop Eggen 所说,您可以使用模数和整数除法来获得不同的坐标视图。例如,您可以说j % 3 + (i % 3) * 3(j, i)框内的索引。这样你只需要两个循环,就像在IsValidRow

static boolean isBlock1Valid(int[][] sudokuBoard)
{
    for(int i = 0; i < 9; i++)
    {
        for(int j = i+1; j < 9; j++)
        {

            if(sudokuBoard[i/3][i%3] == sudokuBoard[j/3][j%3])
                return false;

        }
    }
}
于 2012-03-03T00:19:38.563 回答
0

Just sum them; if 45 then good, else false — assuming you already checked the rows and columns, of course. Also, it is better to keep a separate grid where you denote each region by a unique digit, then you can do lots of other nice stuff, looping over it.

于 2015-05-31T14:44:32.030 回答