从给定的行(x),列(y),找到2D 9x9阵列的3×3子阵列

时间:2015-04-16 17:12:37

标签: java arrays multidimensional-array

所以我试图获得可以放入数独单方的所有可能的条目。我有一个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;
} 

1 个答案:

答案 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++;
     }
  }
}