我在网上找到了一个函数来解决我用C语言编写的数独问题。我几乎完成了所有工作,但是我被困在这里,如果有任何重复的值,我无法检查3x3框:
/**
* Check if a value contains in its 3x3 box for a cell.
* @param row current row index.
* @param col current column index.
* @return true if this cell is incorrect or duplicated in its 3x3 box.
*/
private boolean containedIn3x3Box(int row, int col, int value) {
// Find the top left of its 3x3 box to start validating from
int startRow = row / 3 * 3;
int startCol = col / 3 * 3;
// Check within its 3x3 box except its cell
for (int i = startRow; i < startRow + 3; i++)
for (int j = startCol; j < startCol + 3; j++) {
if (!(i == row && j == col)) {
if (cells[i][j] == value){
return true;
}
}
}
return false;
}
这里是函数,我将其放在程序中:
int valid(int k, int ii, int jj)
{
int i,start,final,j;
start=ii/3*3;
final=jj/3*3;
for(i = 1; i <= 9; ++i) {
if (i != ii && v[i][jj] == k)
return 0;
if (i != jj && v[ii][i] == k)
return 0;
}
for(i=start;i<=start+3;i++)
for(j=final;j<=final+3;j++)
{
if(!(i==ii && j==jj))
{
if(v[i][j]==k)
return 0;
}
}
return 1;
}
我已经在使用此功能的网站上阅读并尝试了解该程序。该程序将值与值部分进行比较。我的循环效果不佳。
最佳答案
您的问题是循环的开始和结束值。
该示例使用基于0的计数。这三个三元组的索引为(0,1,2)(3,4,5)(6,7,8)。
您要使用基于1的循环。
您错过了更改双循环的下限:
int valid(int k, int ii, int jj)
{
int i,start,final,j;
start=ii/3*3;
final=jj/3*3;
for(i = 1; i <= 9; ++i) {
if (i != ii && v[i][jj] == k)
return 0;
if (i != jj && v[ii][i] == k)
return 0;
}
for(i=start+1;i<=start+3;i++) // Changed lower limit
for(j=final+1;j<=final+3;j++) // Changed lower limit
{
if(!(i==ii && j==jj))
{
if(v[i][j]==k)
return 0;
}
}
return 1;
}
关于c - 数独3x3框检查C中是否重复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20993488/