给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
思路:首先找到开头 顺着开头找出符合条件的word
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
if(board.empty())
return false;
if(word.empty())
return true;
int size=board.size();
int length=board[0].size();
int k=word.length();
vector<vector<int>> a(size,vector<int>(length,0)),b=a; // a网格用来记录路线
int ok=0; // 是否存在的标记
for(int i=0;i<size;i++)
{
for(int j=0;j<length;j++)
{
if(board[i][j]==word[0])
{
a[i][j]=1; //找到一个开头 标记1
search(board,a,k,1,i,j,ok,word,size,length); // 从当前开头查找
if(ok) // 查找成功 退回
break;
else
a=b; // 失败 b初始化a 继续找下一个开头
}
}
if(ok)break;
}
if(ok)
return true;
else
return false;
}
void search(vector<vector<char>> &board,vector<vector<int>>& a,int k,int n,int i,int j,int &ok,string word,int size,int length)
{
if(ok==1)return;
if(n==k)
{ok=1; return;} // 查找成功 标记置1 返回
// 上下左右四个方向依次查找
if(n<k&&(i-1)>=0&&a[i-1][j]==0&&board[i-1][j]==word[n])
{ a[i-1][j]=1;search(board,a,k,n+1,i-1,j,ok,word,size,length);a[i-1][j]=0;} // 查找失败时 一定要将网格a复原
if(n<k&&(i+1)<size&&a[i+1][j]==0&&board[i+1][j]==word[n])
{ a[i+1][j]=1;search(board,a,k,n+1,i+1,j,ok,word,size,length);a[i+1][j]=0;}
if(n<k&&(j-1)>=0&&a[i][j-1]==0&&board[i][j-1]==word[n])
{ a[i][j-1]=1;search(board,a,k,n+1,i,j-1,ok,word,size,length);a[i][j-1]=0;}
if(n<k&&(j+1)<length&&a[i][j+1]==0&&board[i][j+1]==word[n])
{ a[i][j+1]=1;search(board,a,k,n+1,i,j+1,ok,word,size,length);a[i][j+1]=0;}
}
};