leetcode79.单词搜索

参考:
https://cloud.tencent.com/developer/article/1199662(看解析和代码注释)
https://leetcode.com/problems/word-search/discuss/27739/My-DFS-%2B-Backtracking-C%2B%2B-solution-(16ms)(参考代码)

回溯法/DFS

class Solution {
private:
    bool dfs(vector<vector<char>>& board, int row, int col, const string &word, int start, int M, int N, int sLen)
    {
        char curC;
        bool res = false;
        if( (curC = board[row][col]) != word[start]) return false;//终止条件,如果矩阵中的点和字符串的点不一致,返回
        if(start==sLen-1) return true; //终止条件,如果字符串搜索完了,返回。
        //第一个和第二个if条件不可换位置,换位置后会出错(当矩阵只有一个字符时出错)
        board[row][col] = '*'; //标记矩阵当前点为已访问
        if(row>0) res = dfs(board, row-1, col, word, start+1, M, N, sLen);//搜索上面的点
        if(!res && row < M-1) res = dfs(board, row+1, col, word, start+1, M, N, sLen);//如果上面点不成功,搜索下面的点
        if(!res && col > 0)   res = dfs(board, row, col-1, word, start+1, M, N, sLen);//如果上下点不成功,搜索左面的点
        if(!res && col < N-1) res = dfs(board,  row, col+1, word, start+1, M, N, sLen);//如果上下左点不成功,搜索右面的点
        board[row][col] = curC; //如果全部失败,以row,col点的路径失败,此路径下不搜索改点,将其标记为未访问
        return res;
    }
    
public:
    bool exist(vector<vector<char>>& board, string word) {
        int M,N,i,j,sLen = word.size();
        if( (M=board.size()) && (N=board[0].size()) && sLen)
        {
            for(i=0; i<M; ++i)
                for(j=0; j<N; ++j)
                    if(dfs(board, i, j, word, 0, M, N, sLen)) return true; //空节点的分支写在主函数里,即开始时可以从矩阵中的任意一点开始搜索
        }
        return false;
    }
};

递归函数的写作业满足回溯法模板:
先写终止条件满足,则返回。
在写分支:上下左右四种分支。对于每种分支写自己的递归函数。
有几个分支就用几次递归函数。if条件语句对应每个分支,即什么条件下走上分支,什么条件下走下分支。。。如果下一步的分支没有条件分别,则不用谢if条件,直接写递归函数。

猜你喜欢

转载自blog.csdn.net/aikudexue/article/details/89460336