今天做这道题目第一感觉是深搜dfs

关于dfs的写法总结有三步:第一步dfs的传递条件,第二步dfs终止的条件,第三步dfs每一层的处理

下面我将从上面的三步分析这道题

dfs的传递条件

dfs(vector<vector<char>>&board,string word,int index,int x,int y)

这里中的board是指矩阵,word是需要查询的单词,index是单词的当前的位置下标,x,y表示矩阵当前的下标

dfs的终止条件

这里我设定if(word[index]!=board[x][y]) return false;  if(index==word.length()-1) return true;

表示有两种情况第一种情况表示当前下标对应的单词与矩阵中的字符不相同时返回错误,第二种情况表示当遍历到单词末尾时结束

dfs的每层的遍历

有当前层表示前面的字符匹配需要确认后面的单词是否匹配,需要进行下一层的遍历

1.这里先标记当前的矩阵位置已经访问过了,确保后面进行方向搜索时候不会用到当期的字符 char t=board[x][y]; board[x][y]='.';这里设置‘.’为标记,顺便将值记录下来,为了后续的回溯

2.定义全局方向坐标 int dx[4]={-1,0,1,0} , dy[4]={0,-1,0,1}

3.选取方向用for循环

for(int i=0;i<4;i++){

int nextx=x+dx[i],nexty=y+dy[i];

if(nextx<0||nextx>=board.size||nexty<0||nexty>=board[0].size||board[nextx][nexty]=='.') continue;//这里进行边界与是否用过的检查

if(dfs(board,word,index+1,nextx,nexty)) return true;//这里进入下一层

}

//遍历方向后没有进入下一层则恢复现场,进行回溯

board[x][y]=t;

return false;

以上就是本题dfs的思路,下面是本题的题解,本题在LeetCode的87题,单词搜索

class Solution {
    int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};
public:
    bool exist(vector<vector<char>>& board, string word) {
        for(int i=0;i<board.size();i++){
            for(int j=0;j<board[0].size();j++){
                if(dfs(board,word,0,i,j)) return true;
            }
        }
        return false;

    }
    bool dfs(vector<vector<char>>& board,string word,int index,int x,int y){
        if(board[x][y]!=word[index]) return false;
        if(index==word.length()-1) return true;
        char t=board[x][y];
        board[x][y]='.';
        for(int j=0;j<4;j++){//方向搜索
            int x1=x+dx[j],y1=y+dy[j];//得到搜索的下标
            if(x1<0||x1>=board.size()||y1<0||y1>=board[0].size()||board[x1][y1]=='.') continue;
            if(dfs(board,word,index+1,x1,y1)) return true;
         }
        board[x][y]=t;
        return false;   
    }
};