给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)
class Solution {
public:
bool ans=false;
int index=0,n,m,slen;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
bool vis[201][201]={false};
void dfs(vector<vector<char>>& board, string word,int nowx,int nowy,int index)
{
if(index==word.length()||ans) 如果没加上res判断,由于要判断四个方格,程序会继续判断下一个方格,这里就是无用的搜索,直接剪去即可。这里不剪枝会超时
{
ans=true;
return;
}
for(int i=0;i<4;i++)
{
int tx=nowx+dx[i];
int ty=nowy+dy[i];
if(tx>=0&&tx<n&&ty>=0&&ty<m&&vis[tx][ty]==false&&board[tx][ty]==word[index])
{
vis[tx][ty]=true;
//if(board[tx][ty]==word[index-1])
dfs(board,word,tx,ty,index+1);
vis[tx][ty]=false;
}
}
}
// void init()
// {
// for(int i=0;i<n;i++)
// {
// for(int j=0;j<m;j++)
// {
// vis[i][j]=false;
// }
// }
// }
bool exist(vector<vector<char>>& board, string word) {
n=board.size();m=board[0].size();slen=word.length();
// fill(vis[0],vis[0]+20*20,false);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(board[i][j]==word[0])
{
//init(); 数组初始化为false也是不需要的,因为找到一条合适的路径就会返回,没找到就会赋值为false退回去了。 如果要找多条路径,那么init是需要的
vis[i][j]=true;
dfs(board,word,i,j,1);
vis[i][j]=false;
}
if(ans==true) return true;
}
}
return ans;
}
};