给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
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:
int n;
int m;
vector<vector<char>> board;
vector<vector<bool>> st;
string word;
bool exist(vector<vector<char>>& _board, string _word) {
board = _board;//在这里要定义一下变量, 进行一下初始化
word = _word;
n = board.size();
m = board[0].size();
st = vector<vector<bool>>(n,vector<bool>(m,false)); // 定义一个二维数组,所有的值初始化为false;
for (int i =0; i<n;i++){
for(int j =0; j<m;j++){
if(board[i][j] ==word[0]){// 在这里找到一个起始点
if(dfs(i,j,1)){
return true;// 利用DFS 来解决这个问题
}
}
}
}
return false;
}
bool dfs( int x, int y, int u){
if (u==word.size()){//如果已经到了最后面的数据的话,就返回true
return true;
}
st[x][y] = true;//定义为true
int dx[4] = {-1,0,1,0};// 在这里首先定义四个方向...
int dy[4] = {0,1,0,-1};//
for (int i =0; i<4; i++){
int a = x + dx[i];
int b = y + dy[i];// 在这里遍历四个方向
if( a>=0 && a<n && b>=0 && b<m && !st[a][b] && board[a][b] == word[u]){
if (dfs(a,b,u+1)){//判断一下边界值,以及没有被访问过并且 值相等
return true;
}
}
}
st[x][y] = false;//在这里要注意吧原来的值赋值为false;
return false;
}
// 加油,加油。。。 Try to make yourself more excellent...
};