嘿,我无法让我的代码比较给定行或列的整数和块,以确保这些参数中没有重复项。我不知道用3种不同的方法分离三个约束条件或者只是尝试一次性完成所有操作是一个好主意。
public static rowCheck(int[][] nsudokuBoard) {
for (int i =0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
// (nsudokuBoard)
}
}
}
这是我开始的代码。在你们打击我之前甚至无法编译这个我如何比较2d数组的一行的所有值。
答案 0 :(得分:2)
您可以比较2d数组的所有值,如下面的代码所示:
void validate(final int[][] nsudokuBoard) {
final int width = nsudokuBoard[0].length;
final int depth = nsudokuBoard.length;
for (int i = 0; i < width; i++) {
int j = i;
int reference = nsudokuBoard[i][j];
do {
if (j < width) {
int current = nsudokuBoard[i][j];
if (current == reference) {
// invalid entry found do something
}
}
if (j < depth) {
// note reversed indexes
int current = nsudokuBoard[j][i];
if (current == reference) {
// invalid entry found do something
}
}
++j;
} while ((j >= width) || (j >= depth));
}
}
我没有尝试编译此代码,但它应该让您了解如何完成任务。我建议你不应该传入int[][] sudokuBoard
,而应该定义一个封装了SudokuSquare
概念并传入SudokuSquare[][]
的类,这样你的validate
方法就可以返回包含所有违规条目的List<SudokuSquare>
。
答案 1 :(得分:0)
我将展示你如何在一行中做到这一点,然后你可以弄清楚其余部分。我假设您的值为1
到9
,并且您没有任何零或任何“未填充条目”。
boolean isRowValid(int[][] grid, int row) {
boolean[] seen = new boolean[9];
int row; // chosen somewhere else
for (int col = 0; col < 9; col++) {
if (seen[grid[row][col] - 1]) { // if we've seen this value before in this row
return false; // there is a duplicate, and this is a bad sudoku
}
seen[grid[row][col] - 1] = true; // mark us as having seen this element
}
return true; // we're all good
}
return true; // this row is fine
答案 2 :(得分:0)
创建一个包含字段row,col,block,value的类;然后用field cell = cell []创建一个Matrix类,填充矩阵。 使用main方法Matrix matrix = init(int [] [])创建一个类检查器并检查(矩阵),其中init(·)填充矩阵。 boolean ok = check(matrix)check(Matrix)if if(!rowcheck())返回false; if(!colcheck())返回false等;
创建一些方法,如getrows(),getrow(r)和for(Cell cell:matrix.values())来过滤掉你想要的方法。
有点单调乏味,但我做到了,它像岩石一样坚固。作为一个注释,过滤矩阵可能看起来很愚蠢,但计算机很快,问题是O(1),因为它是9x9。