所以我的代码有点问题..假设交叉检查相同整数的行和列。
这是我到目前为止...但是当我运行它时,它似乎只检查第一个整数。 (例如,数独板的第一行读取.1 2 2 2 2 2 2 2 2 2)它不会检测到明显的多个2,但如果我将输入更改为1 1 2 2 2 2 2 2 2错误将会到来在这种情况下,多个1。多个任何建议调整我的循环,使其通过列?
public static void validate(final int[][] sudokuBoard) {
int width = sudokuBoard[0].length;
int depth = sudokuBoard.length;
for (int i = 0; i < width; i++) {
int j = i;
int reference = sudokuBoard[i][j];
while (true) {
if ((j >= width) || (j >= depth)) {
break;
}
else if (i == j){
// do nothing
}
else if (j < width) {
int current = sudokuBoard[i][j];
if (current == reference) {
System.out.print("Invalid entry found (width)" + "\n");
System.out.print(current + "\n");
// invalid entry found do something
}
} else if (j < depth) {
// note reversed indexes
int current = sudokuBoard[j][i];
if (current == reference) {
System.out.print("Invalid entry found (depth)" + "\n");
System.out.print(current + "\n");
// invalid entry found do something
}
}
j++;
}
答案 0 :(得分:3)
您的代码比应有的更复杂。当你可以分成几个不同的函数时,为什么要把所有东西都放在一个函数中?
public static void Validate(final int[][] sudokuBoard)
{
int width = sudokuBoard[0].length;
int depth = sudokuBoard.length;
for(int i = 0; i < width; i++)
if(!IsValidRow(sudokuBoard, i, width))
{
//Do something - The row has repetitions
}
for(int j = 0; j < height; j++)
if(!IsValidColumn(sudokuBoard, j, width))
{
//Do something - The columns has repetitions
}
}
static bool 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;
}
static bool IsValidColumn(int[][] sudokuBoard, int referenceColumn, int height)
{
//Compare each value in the column to each other
for(int i = 0; i < height; i++)
{
for(int j = i + 1; j < height; j++)
{
if(sudokuBoard[i][referenceColumn] == sudokuBoard[j][referenceColumn])
return false
}
}
return true;
}
这样,您的代码更易于维护/读取。上面的代码尚未经过测试,但它应该是正确的。
我建议您逐步调试此代码,以便真正了解正在发生的事情,如果您不清楚这一点。
答案 1 :(得分:0)
鉴于数独的约束(一行n个单元格必须只包含数字1-n)你不需要命令n ^ 2搜索(每行或每列),你可以通过保持一个命令来命令n位数组,指示您看到的数字。这是用于检查行的伪代码,对列执行相同的操作:
for i in 0 to depth-1 // rows
boolean seen[] = new seen[width];
for j in 0 to width-1 // columns
if seen[board[i][j]-1] == true
duplicate number
else
seen[board[i][j]-1] = true
答案 2 :(得分:0)
我会将功能分解为更小的布尔检查。这样,您可以逐行,逐列,逐个方格验证。例如
private boolean isValidRow(int[] row) {
// Code here to check for valid row (ie, check for duplicate numbers)
}
private boolean isValidColumn(int[] column) {
// Code here to check for valid column
}
private boolean isValidSquare(int[][] square) {
// Code here to check for valid square
}
请注意,行和列只需要传递一维数组。正方形是一个二维数组,因为您需要检查3x3区域。您还可以将这些方法视为static
,因为它们的功能独立于Sudoku板实例。
编辑:关于行/列/方验证的建议是使用HashSet。集合只能包含特定值的1个元素,因此您可以添加元素并查找失败。例如:
HashSet<Integer> hs = new HashSet<Integer>();
for(int i = 0; i < 9; i++) {
if(!hs.add(integerArray[i])) // HashSet.add returns 'false' if the add fails
// (ie, if the element exists)
return false;
}
return true;