我正在用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值并再试一次 - 它将如何用一个不同的数字填充它,而不是像之前那样从第一个开始?