如何清理这些嵌套的for循环?

时间:2013-10-13 20:20:05

标签: c++

注意:前面的代码错误。你已被警告过了。

此代码遍历数独谜题中所有3x3方格中的所有元素。下面显示的方法是它获取每个正方形的左上角元素的坐标,然后遍历该正方形中的每个元素。这意味着只需要4个“for”循环来访问正确的索引,然后是另一个“for”循环来执行正确的操作。

此代码将起作用(如果放入了缩进的代码),但它看起来非常混乱并且很难阅读。有没有更好的方法来消除这些嵌套的“for”循环?

提前致谢。

void Sudoku::updateSquares(int grid[9][9], int possibleSolutions[9][9][10])
{
    for (int i = 0; i < 9; i += 3)
    {
        for (int j = 0; j < 9; j += 3)      //for every square:
        {
                            //Other code
                            //...
                            //Other code

            //updates the possibleSolutions array
            for (int k = 0; k < 3; k++)
            {
                for (int l = 0; l < 3; l++)    //for every element in every square:
                {
                    if(grid[i+k][j+l] != 0)
                        continue;
                    for (int n = 0; n < 10; n++)
                    {
                        if(possibleSolutions[i+k][j+l][n] != 0 && numbers[n] == 0)
                        {
                            possibleSolutions[i+k][j+l][n] = 0;
                            possibleSolutions[i+k][j+l][0] -= 1;  //reduce the size, which is held in [][][0]
                        }
                    }
                }
            }

        }
    }
}

1 个答案:

答案 0 :(得分:1)

你已经实现了一种叫做“穷举搜索”的东西,它基本上是在尝试每种可能的方块组合。

  1. 您是否听说过循环展开的内容?

    - &GT;而不是5个嵌套的For循环使用更少的嵌套循环多次;类似于2个嵌套循环的东西。

  2. 使用动态编程方法,可能是O(n ^ 2)

  3. Top Coder DP example.