典型的dfs,去找这个阵型中有没有一条路是给出的单词。
大致思路:
dfs。注意点:vis数组别忘了写!!!!!if判断中要判断边界、题目条件还要判断是否访问过!!然后,还要在dfs的上文置vis[xx][yy]=1(尤其是如果在主函数中第一次调用,也要记得),在dfs的下文还原vis[xx][yy]=0,表示不走这条路,换一条路!
AC代码:
class Solution {
public:
bool flag=false;
int xxx[4]={-1,1,0,0};
int yyy[4]={0,0,-1,1};
int row;
int col;
int vis[5000][5000]; //不要忘了用vis数组!!!!
bool exist(vector<vector<char> > &board, string word) {
if(board.size()==0)
return false;
if(word.size()==0)
return false;
row = board.size();
col = board[0].size();
//dfs
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(board[i][j]==word[0])
{
vis[i][j]=1; //!!!!
dfs(board,word,0,i,j);
vis[i][j]=0; //!!!!
if(flag)
return true;
}
}
}
return false;
}
void dfs(vector<vector<char> > board, string word, int index,int x,int y)
{
if(flag) //已经找到了。剪枝
return;
if(index==word.size()-1) //找到了最后一个字母
{
flag=true;
return;
}
//分别对四个方向进行遍历,找下一个字母
for(int i=0;i<4;i++)
{
int xx= x+xxx[i];
int yy= y+yyy[i];
if(xx<0||xx>=row||yy<0||yy>=col||vis[xx][yy]==1|| board[xx][yy]!=word[index+1])
continue; //超边界 OR 被访问过 OR 不是下一个字母
vis[xx][yy]=1; //!!!!
dfs(board,word,index+1,xx,yy);
vis[xx][yy]=0; //!!!!
}
}
};