まったく同じ問題を解決するために、約 4 年前に C で次のコードを書きました。int 配列は 9x9 グリッドでした。「index」は、0~8 行目、0~8 列目、0~8 ボックスを指定します。
int checkBox(int a[][9], int index)
{
int i, j, isValid = 1;
int m, n;
for(i = 3*(index%3) ; isValid && (i < (3*(index%3) + 3)); i++)
{
for(j = 3*(index/3); isValid && (j < (3*(index/3) + 3)); j++)
{
for(m = (3*(index%3)) ; isValid && (m < (3*(index%3) + 3)); m++)
{
for(n = 3*(index/3); isValid && (n < (3*(index/3) + 3)); n++)
{
if(isValid && (a[m][n] == 0) || ((i != m) || (j != n)) && (a[i][j] == a[m][n])) //select given element and compare others to it
{ //if any element is the same that is not itself then the sudoku is not valid
isValid = 0; //this checks for 3x3 box
}
}
}
}
}
return isValid;
}
基本的に、特定のボックスが選択されるまでインデックスを操作し、そのボックスですべての数字をチェックして、何らかの一致があるかどうかを確認しました。一致した場合、数独は無効です。
最後に、次のように有効性を確認しました。
int checkSudoku(int a[][9]) //check every row, column and box
{ //if there is no contradiction then it is valid
int i, isValid = 1;
for(i = 0; isValid && (i < 9); i++)
{
isValid = (checkLine(a, i) && checkColumn(a, i) && checkBox(a, i));
}
return isValid;
}
もちろん、Java が単なる配列管理であることを考えると、同じ概念を Java に適用できます。