题目:
Given a 2D board and a word, find if the word exists in the grid.
The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.
For example,
Given board =
[ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E'] ]word =
"ABCCED"
, -> returns
true
,
word =
"SEE"
, -> returns
true
,
word =
"ABCB"
, -> returns
false
.
对于board中的任意一点如果是word中的第一个字母,则查找word中第二个字母是否在
board中该点四周,如果在,则递归至第二个字母,如此直至word的最后一个字母
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
if(word.size()==0)
return true;
int row=board.size();
int col=board[0].size();
vector<vector<int>>visited(row, vector<int>(col)); //判断某个点是否遍历过
if(row==0||col==0) return false;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(board[i][j]==word[0])
if(dfs(board,word,0,i,j,visited))
return true;
}
}
return false;
}
bool dfs(vector<vector<char>>&board,string word,int count,int row,int col,vector<vector<int>> &visited){
if(count==word.size()-1)
return true;
visited[row][col]=1; //访问该点设置已遍历
if(row-1>=0&&visited[row-1][col]==0&&board[row-1][col]==word[count+1])//上下左右递归
if(dfs(board,word,count+1,row-1,col,visited))
return true;
if(row+1<board.size()&&visited[row+1][col]==0&&board[row+1][col]==word[count+1])
if(dfs(board,word,count+1,row+1,col,visited))
return true;
if(col-1>=0&&visited[row][col-1]==0&&board[row][col-1]==word[count+1])
if(dfs(board,word,count+1,row,col-1,visited))
return true;
if(col+1<board[0].size()&&visited[row][col+1]==0&&board[row][col+1]==word[count+1])
if(dfs(board,word,count+1,row,col+1,visited))
return true;
visited[row][col]=0; //访问失败设置为0
return false;
}
};