题目来源:leetcode79 单词搜索
题目描述:
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false
提示:
board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3
解题思路:
回溯。记录访问过的位置,一条路走不通则回退。
class Solution {
public:
bool backtrace(vector<vector<bool>> &visited,vector<vector<char>>& board, string word,int index,int row,int col){
int m=board.size(),n=board[0].size();
if(index==word.size()){
return true;
}
if(row>=0&&row<m&&col>=0&&col<n&&board[row][col]==word[index]&&!visited[row][col])
{
visited[row][col]=true;
bool judge=backtrace(visited,board,word,index+1,row+1,col)||backtrace(visited,board,word,index+1,row,col+1)||backtrace(visited,board,word,index+1,row-1,col)||backtrace(visited,board,word,index+1,row,col-1);
if(judge==false) visited[row][col]=false;
else return true;
}
return false;
}
bool exist(vector<vector<char>>& board, string word) {
int m=board.size(),n=board[0].size();
vector<vector<bool>> visited(m,vector<bool>(n,false));
bool judge=false;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(backtrace(visited,board,word,0,i,j)) return true;
}
}
return false;
}
};