首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ -解决数独游戏

C++ -解决数独游戏
EN

Stack Overflow用户
提问于 2011-12-06 22:39:59
回答 2查看 1.4K关注 0票数 0

我刚接触C++,必须做一个家庭作业(数独)。我被一个问题卡住了。

问题是要实现搜索功能来解决数独问题。

说明:为了找到解决方案,使用递归搜索,如下所示。假设有一个尚未分配的数字字段(d1....dn) (n > 1)。然后,我们首先尝试将字段分配给d1,执行传播,然后递归地继续搜索。可能发生的情况是,传播会导致失败(字段变为空)。在这种情况下,搜索会失败,并且需要为其中一个字段尝试不同的数字。由于搜索是递归的,因此尝试最后考虑的字段的下一个数字。如果没有一个数字指向解决方案,搜索将再次失败。这反过来将导致尝试与前一个字段不同的数字,依此类推。

在通过为数字d分配字段来尝试数字d之前,您必须创建一个新的板,作为当前板的副本(使用复制构造函数,并使用new从堆中分配板)。然后才能在副本上执行分配。如果对搜索的递归调用返回不成功,则可以为要尝试的下一个数字创建新的电路板。

我试过了:

代码语言:javascript
复制
// 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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-06 23:16:46

您的代码中没有递归。您不能只访问每个字段一次,然后尝试为其赋值。问题是,你可以将5赋给(3,4)域,而只有当你到达(6,4)域时,才会发现(3,4)处不可能有5。最终,您需要退出递归,直到您返回到(3,4)并在那里尝试另一个值。

对于递归,您可能不会使用嵌套的for循环来访问字段,而是使用递归调用来访问下一个字段。您可以设法到达最后一个字段,也可以尝试所有可能的方法,然后离开函数返回到您访问的前一个字段。

Sidenote:绝对不要为这个任务分配动态内存:

代码语言:javascript
复制
//Board *copyBoard = new Board(*this);
Board copyBoard(*this); //if you need a copy in the first place
票数 2
EN

Stack Overflow用户

发布于 2011-12-07 00:32:41

基本上你可以尝试的东西是这样的(伪代码)

代码语言:javascript
复制
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(...)函数可以返回一个随机的空正方形或剩余选项数最少的正方形。使用后者将使算法收敛得更快。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8401676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档