我正在构建一个数独检查器,我已经制作了行检查器和列检查器。我目前正在尝试制作块检查器(3x3块)。对此的任何见解都会很棒。
public boolean checkBlock (int col0to2, int row0to2)
{
int [] tempArray = new int [3];
for (int x=0; x<3; x++)
{
for (int y=0; y<3;y++)
{
if ((board [col0to2+x][row0to2+y]) > 0 && (board [col0to2+x][row0to2+y]) < 10)
{
int tempVal = board [col0to2+x][row0to2+y];
tempArray [tempVal - 1] = tempVal; // i think this line is giving me the run
// error
}
}
}
return true;
}
答案 0 :(得分:1)
if ((board [col0to2+x][row0to2+y]) > 0 && (board [col0to2+x][row0to2+y]) < 10) {
int tempVal = board [col0to2+x][row0to2+y];
tempArray [tempVal - 1] = tempVal; // i think this line is giving me the run error
}
你对tempval的界限检查应该是1到9(含)。假设它是9.然后你分配tempArray [8] = 9.你遇到了一个问题,因为tempArray被初始化为一个包含3个元素的数组。
我想你想要这样的东西:
tempArray = new int[9]
和分配
tempArray[x*3 + y] = tempVal
;
虽然我没有测试过,但基本上它用它找到的每个数字填充数组。
答案 1 :(得分:0)
由于您需要处理数字1-9,因此tempArray
中需要9个整数的空间,但您声明它只有3个长整数。此外,您并没有真正检查是否使用了所有数字(并且没有重复)。
public boolean checkBlock (int col0to2, int row0to2) {
int [] tempArray = new int [9];
for (int x=0; x<3; x++) {
for (int y=0; y<3;y++) {
int tempVal = board [col0to2+x][row0to2+y];
if (tempVal > 0 && tempVal < 10) {
if (tempArray[tempVal - 1] != 0) {
return false;
}
tempArray [tempVal - 1] = tempVal;
}
}
}
return true;
}
答案 2 :(得分:0)
有9个可能的值,因此您的数组的大小应为9
,而不是3
您只需要计算单元格是否已经填充。如果有,则返回false。如果你在没有返回false的情况下结束它,则返回true。
++
使返回的值递增,以便您可以对其进行比较。如果它是2,则单元格已经递增。
public class BlockTest {
public static boolean checkBlock (int col0to2, int row0to2)
{
int [] tempArray = new int[9];
for (int x=0; x<3; x++)
{
for (int y=0; y<3;y++)
{
int tempVal = board [col0to2+x][row0to2+y];
if (tempVal < 1 || tempVal > 9) return false;
if (++tempArray[tempVal - 1] == 2) return false;
}
}
return true;
}
public static int[][] board = new int[9][9];
public static void main(String[] args) {
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
board[i][j] = i*3 + j + 1;
}
}
System.out.println(checkBlock(0,0));
board[0][0] = 7;
System.out.println(checkBlock(0,0));
}
}
true
false
答案 3 :(得分:0)
我可以看到你来自哪里,但正如其他人所说,你的tempArray需要能够包含9个值。我之前写了一个数独检查器(单一分配,解决方案检查是正确的,整个数独应用程序的标记为90%)我的偏好是有一个包含9个值的数组,每个代表1-9位数字,但是我没有将值设置为tempVal,而是增加了它。检查你只会让每个号码中的一个更容易。
int [] boxCounts = {0, 0, 0, 0, 0, 0, 0, 0, 0};
// X loop
// y loop
// get value
boxCounts[value - 1]++;
// end y loop
// end x loop
// check we found one of each
for(int j = 0; j < 9; j++) {
if(boxCounts[j] != 1 )
return false;
}
}