数独递归:回溯的确切位置和方式如何?

时间:2014-07-18 18:35:40

标签: c++ recursion

我正在用c ++编写自己的数独代码,但有一些分配要求。它必须使用递归和向量向量。我想我通常理解c ++语言部分,但我没有在回溯过程中获得逻辑。我的伪代码会将我的i,j位置传递给另一个类中的其他函数以及值k(选择1-9)。假设我在我的求解中进行了3次迭代,我到达了一个正方形,我检查了所有值1-9并且它们都没有工作。现在我把它设置为零并且必须回溯,然后转到我之前工作的前一个方形/迭代并尝试不同的值继续进行,回到我正在进行的方格并再次检查。

我的确切问题是:在我的代码中可以将此移回上一个方块吗?我没有看到如何适应这个或如何在这些循环中工作?如果我不返回一个,那么我的代码将再次找到相同的方块并运行所有9个选项,失败,并在无限递归中再次返回?我害怕开始测试此代码的运行,因为害怕无限递归循环。我的伪代码如下:

      bool Board::solveBoard()
  {
Board board;
if(board.isComplete())
{
    board.display();
    return true;
}
for(int i=ZERO;i<NINE;++i)//iterate through row vectors
{
    for (int j=ZERO;j<NINE;++j)//iterate through column vectors
    {
      if(board.getSquare(i,j)==ZERO)//find first value equal to zero
      {
        for(int k=ONE;k<=NINE;++k)//iterate through values 1-9 to fill square and check board
        {
        board.setSquare(i,j,k);//assign k=1 to 9
          if(board.isLegal(i,j,k))//check if value is legal
          {
            if(solveBoard)  return true;
          }
          board.unsetSquare(i,j);//otherwise remove value in backtracking?
        }//end # 1-9 iteration
      }//end get square-check square loop
      return false;//I think this is where the program will go back a step to the last value worked previously
    }//end column iteration
}//end row iteration

} // bool Board :: solveBoard()

符号ZERO,NINE等是指导者要求大写的“神奇数字”。我已经读过无限递归可以填满计算机内存并使其崩溃,这就是我担心的原因。我只是想确定回溯到上一步的位置实际发生了什么?我向底部返回false,它将在列迭代中返回false。那么这会告诉迭代回到之前的j值并再试一次 - 它将如何用一个不同的数字填充它,而不是像之前那样从第一个开始?

0 个答案:

没有答案