您好我正在使用数独检查器来验证已完成的主板解决方案是否正确。我目前难以理解如何在街区内进行检查。现在我有一个布尔值如下 我在哪里检查左上方的区块(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;
}
答案 0 :(得分:3)
因为这是家庭作业,只是一个提示。模3(i % 3
)和整数除以3(i / 3
)可用于将0 ... 8的分数分成3部分并在该部分中作为索引。
答案 1 :(得分: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;
答案 2 :(得分: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;
}
}
}
答案 3 :(得分:0)
总结一下;如果45那么好,否则假 - 假设你已经检查了行和列,当然。此外,最好保留一个单独的网格,用一个唯一的数字表示每个区域,然后你可以做很多其他好东西,循环遍历它。