【问题标题】:Sodoku Solver using recursive backtracking method使用递归回溯法的数独求解器
【发布时间】:2016-06-20 07:40:30
【问题描述】:
class Solution {
private:
    bool search(vector<vector<char>>& board, int r, int c, bool rTakens[][9], bool cTakens[][9], bool subTakens[][9])
    {
        if(r == 9) return true; //level checking;
        if(c == 9) return search(board, r+1, 0, rTakens, cTakens, subTakens);
        if(board[r][c] != '.') return search(board, r, c+1, rTakens, cTakens, subTakens);
        for(char a = '1'; a <= '9'; ++a) //try different cases;
        {
            int num = a -'0', k = r/3*3+c/3;
            if(!(rTakens[r][num] || cTakens[c][num] || subTakens[k][num])) //filter out the invalid;
            {
                rTakens[r][num] = cTakens[c][num] = subTakens[k][num] = true;
                board[r][c] = a;
                if(search(board, r, c+1, rTakens, cTakens, subTakens)) return true;
                board[r][c] = '.'; //restore to its original state;
                rTakens[r][num] = cTakens[c][num] = subTakens[k][num] = false;
            }
        }
        return false;
    }
public:
    //AC - 4ms - best submission;
    void solveSudoku(vector<vector<char>>& board) 
    {
        bool rTakens[9][9]{{false}}, cTakens[9][9]{{false}}, subTakens[9][9]{{false}};
        for(int r = 0; r < 9; ++r) //initialize the takens;
            for(int c = 0; c < 9; ++c)
                if(board[r][c] != '.')
                {
                    int num = board[r][c] -'0', k = r/3*3+c/3;
                    rTakens[r][num] = cTakens[c][num] = subTakens[k][num] = true;
                }
        search(board, 0, 0, rTakens, cTakens, subTakens); //time to search and fill up the board;
    }
};

上面的解决方案对于解决独特的数独是非常直接和有效的,但是有一个问题让我很困惑:

board[r][c] = '.'; //恢复到原来的状态;

为什么我必须添加这个?如果当前的填充没问题,那么它就会返回,如果不是,那么答案将在以下候选者中,这些候选者将在进一步搜索之前替换它;所以据我所知,这里只需要重置令牌。但是当我删除它时,结果将是错误的。而且追踪整个过程很棘手,所以我在这里寻找一些有用的想法。

提前感谢您的时间和回答!

【问题讨论】:

    标签: recursion backtracking


    【解决方案1】:

    对于棋盘的特定单元格,让我们假设第一个“。”的唯一答案。单元格是“2”,那么当我们第一次尝试为第一个单元格设置“1”时,接下来的所有“。”单元格将失败,如果我们在搜索后不恢复它们,那么当我们为第一个 '.' 尝试 '2' 时单元格,原始的“。”单元格将已经填满了 un-'。'这将直接结束搜索并返回错误的结果。

    【讨论】:

      猜你喜欢
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多