大约 4 年前,我用 C 语言编写了以下代码来解决完全相同的问题,尽管它看起来很暴力。int 数组是一个 9x9 网格。“索引”指定第 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,考虑到它只是数组管理。