//这是我写过最难的递归了。。。
//
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
int m = board.size();
int n = board[0].size();
for(int i=0;i < m;i++){
for(int j=0;j < n;j++)
if(DFS(board,word,0,i,j)) return true;
}
return false;
}
// DFS搜索从x,y开始是否有word。
bool DFS(vector<vector<char>>& board,string word,int pos,int x,int y){
int m = board.size();
int n = board[0].size();
int res;
if(pos == word.size())return true;//其实符合最后再需要一次递归调用才能被判断正确
if(x < 0||y < 0||x >= m||y >= n||board[x][y]!=word[pos]){//边界和字符都判断了很好。
return false;
}
else{
char s = board[x][y];//递归中常见的改变以后要还原
board[x][y] = '#';
res = DFS(board,word,pos+1,x-1,y)||DFS(board,word,pos+1,x+1,y)||DFS(board,word,pos+1,x,y-1)||DFS(board,word,pos+1,x,y+1);//搜索四周只要有一个是true,就是true
board[x][y] = s;
}
return res;
}
};