一、题目
二、代码
class Solution
{
public:
bool find=0;
void track_back(int i, int j,vector<vector<char>>& board, vector<vector<bool>>& visited, string word, int pos )
{
//越界 访问过 不相等或已经找到 返回
if(i<0||i>board.size()-1||j<0||j>board[0].size()-1||visited[i][j]||board[i][j]!=word[pos]||find) //
{
return ;
}
//相等 继续
else
{
if(pos==word.size()-1)
{
find=1;
return;
}
else
{
visited[i][j]=1;
track_back(i-1,j,board,visited,word,pos+1);
track_back(i+1,j,board,visited,word,pos+1);
track_back(i,j-1,board,visited,word,pos+1);
track_back(i,j+1,board,visited,word,pos+1);
visited[i][j]=0;
}
}
}
//新颖点:每个visited 容器各不相同
//核心: 回溯的撤销很有灵魂
//注意 : 对于vector的clear 会抹除内容
bool exist(vector<vector<char>>& board, string word)
{
int i,j;
vector<vector<bool>> visited(board.size(),vector<bool> (board[0].size(),0));
if(board.size()==0) return 0;
for(i=0;i<board.size();i++)
{
for(j=0;j<board[0].size();j++)
{
track_back(i,j,board,visited,word,0);
if(find==1) return 1;
}
}
return find;
}
};