数独3x3框检查是否在C中重复

时间:2014-01-08 10:53:18

标签: c sudoku

我在互联网上找到了一个功能,用于解决我在用C语言编写的Sudoku上的问题。我几乎已经完成了所有工作,但我被困在这里,如果有任何值重复,我无法检查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;
}

我已经在网站上阅读了这个功能并尝试了解该程序。该程序将值与值部分进行比较。我的循环效果不佳。

1 个答案:

答案 0 :(得分:0)

问题在于循环开始和结束值。

该示例使用从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;
}