我刚接触C++,必须做一个家庭作业(数独)。我被一个问题卡住了。
问题是要实现搜索功能来解决数独问题。
说明:为了找到解决方案,使用递归搜索,如下所示。假设有一个尚未分配的数字字段(d1....dn) (n > 1)。然后,我们首先尝试将字段分配给d1,执行传播,然后递归地继续搜索。可能发生的情况是,传播会导致失败(字段变为空)。在这种情况下,搜索会失败,并且需要为其中一个字段尝试不同的数字。由于搜索是递归的,因此尝试最后考虑的字段的下一个数字。如果没有一个数字指向解决方案,搜索将再次失败。这反过来将导致尝试与前一个字段不同的数字,依此类推。
在通过为数字d分配字段来尝试数字d之前,您必须创建一个新的板,作为当前板的副本(使用复制构造函数,并使用new从堆中分配板)。然后才能在副本上执行分配。如果对搜索的递归调用返回不成功,则可以为要尝试的下一个数字创建新的电路板。
我试过了:
// Search for a solution, returns NULL if no solution found
Board* Board::search(void) {
// create a copy of the cur. board
Board *copyBoard = new Board(*this);
Board b = *copyBoard;
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
// if the field has not been assigned, assign it with a digit
if(!b.fs[i][j].assigned()){
digit d = 1;
// try another digit if failed to assign (1 to 9)
while (d <=9 && b.assign(i, j, d) == false){
d++;
// if no digit matches, here is the problem, how to
// get back to the previous field and try another digit?
// and return null if there's no pervious field
if(d == 10){
...
return NULL;
}
}
}
}
return copyBoard;
}另一个问题是在哪里使用递归调用?有什么建议吗?谢谢!
可在此处找到完整的说明:http://www.kth.se/polopoly_fs/1.136980!/Menu/general/column-content/attachment/2-2.pdf
代码:http://www.kth.se/polopoly_fs/1.136981!/Menu/general/column-content/attachment/2-2.zip
发布于 2011-12-06 23:16:46
您的代码中没有递归。您不能只访问每个字段一次,然后尝试为其赋值。问题是,你可以将5赋给(3,4)域,而只有当你到达(6,4)域时,才会发现(3,4)处不可能有5。最终,您需要退出递归,直到您返回到(3,4)并在那里尝试另一个值。
对于递归,您可能不会使用嵌套的for循环来访问字段,而是使用递归调用来访问下一个字段。您可以设法到达最后一个字段,也可以尝试所有可能的方法,然后离开函数返回到您访问的前一个字段。
Sidenote:绝对不要为这个任务分配动态内存:
//Board *copyBoard = new Board(*this);
Board copyBoard(*this); //if you need a copy in the first place发布于 2011-12-07 00:32:41
基本上你可以尝试的东西是这样的(伪代码)
bool searchSolution(Board board)
{
Square sq = getEmptySquare(board)
if(sq == null)
return true; // no more empty squares means we solved the puzzle
// otherwise brute force by trying all valid numbers
foreach (valid nr for sq)
{
board.doMove(nr)
// recurse
if(searchSolution(board))
return true
board.undoMove(nr) // backtrack if no solution found
}
// if we reach this point, no valid solution was found and the puzzle is unsolvable
return false;
}getEmptySquare(...)函数可以返回一个随机的空正方形或剩余选项数最少的正方形。使用后者将使算法收敛得更快。
https://stackoverflow.com/questions/8401676
复制相似问题