所以我试图获得可以放入数独单方的所有可能的条目。我有一个9x9 2D阵列,它进一步分为3x3子阵列。我想写一个方法,需要一行&其参数中的列组合并返回可在该特定位置进行的所有可能条目。 我的方法的前2个for循环获取整个行中的所有已存在的非零值&指定的整列并将它们存储在一个数组(alreadyInUse)中,稍后将用于确定哪些数字尚未使用。第三个for循环应该使用行,列组合,找到特定的子数组并将其条目添加到alreadyInUse数组中。
有没有办法使用2D数组的给定行,列来查找子数组的行,列?
// Method for calculating all possibilities at specific position
public int[] getPossibilities(int col, int row){
int [] possibilities;
int [] alreadyInUse = null;
int currentIndex = 0;
if(sudoku[row][col] != 0){
return new int[]{sudoku[col][row]};
}
else{
alreadyInUse = new int[26];
//Go into Row x and store all available numbers in an alreadyInUse
for(int i=0; i<sudoku.length; i++){
if(sudoku[row][i] !=0){
alreadyInUse[currentIndex] = sudoku[row][i];
currentIndex++;
}
}
for(int j=0; j<sudoku.length; j++){
if(sudoku[j][col] !=0){
alreadyInUse[currentIndex] = sudoku[j][col];
currentIndex++;
}
}
for(int k=...???
}
return possibilities;
}
答案 0 :(得分:2)
您可以使用模数过滤掉子数组。例如,一种方法是使用表达式n - (n % 3)
。例如,如果row是第8列(0索引数组中的最后一列),则此表达式将返回6.对于第6列,也将返回6,但对于第5列,它将返回3。
然后,一旦你有左上角的单元格,你可以使用嵌套循环遍历所有9个单元格,一次三个。
此处的相关代码:
int x_left = (row - (row % 3));
int y_top = (col - (col % 3));
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
if(sudoku[i + x_left][j + y_top] != 0) {
alreadyInUse[currentIndex] = sudoku[i + x_left][j + y_top];
currentIndex++;
}
}
}