思路:DFS方法,在当前位置向上下左右四个方向进行搜索,因为每个格子只能使用一次,所以采用一个与棋盘相同大小的 flag 矩阵来标记是否使用过。之后采用每个棋盘位置作为初始值进行搜索。
code:
class Solution {
int dirMatrix[4][2] = {
{0,1},
{-1,0},
{0,-1},
{1,0}
};
public:
bool isInMatrix(int i,int j,int rows,int cols){
if(i >= 0 && i < rows && j >= 0 && j <cols)
return true;
return false;
}
bool dfs(vector<vector<char> > &board,vector<vector<bool> > &flag, string word, int x, int y){
int rows = board.size(), cols = board[0].size();
if(board[x][y] == word[0]){
if(word.length() == 1)return true;
flag[x][y] = true;
for(int i = 0;i < 4;i++){
int newX = x + dirMatrix[i][0], newY = y + dirMatrix[i][1];
if(isInMatrix(newX,newY,rows,cols) && !flag[newX][newY]){
flag[newX][newY] = true;
if(dfs(board,flag,word.substr(1),newX,newY))
return true;
flag[newX][newY] = false;
}
}
flag[x][y] = false;
return false;
}
return false;
}
bool exist(vector<vector<char> > &board, string word) {
int n = board.size(), m = board[0].size();
vector<bool> f(m,false);
vector<vector<bool> > flag(n,f);
for(int i = 0;i < n;i++)
for(int j = 0;j < m;j++)
if(dfs(board,flag,word,i,j))
return true;
return false;
}
};