LeetCode79. Word Search
题意
m* n的单词序列, 查找其中是否有某单词
方法
DFS + 回溯
代码
const static int N = 100,M = 100,K = 100;
int dir[2][4] = {{1,0,0,-1},{0,1,-1,0}};
bool dp[4][N][M][K];/* dir i j l */
bool vis[N][M];
int n,m;
bool check(int i,int j)
{
return 0 <= i && i < n && 0 <= j && j < m;
}
bool dfs(int x,int y,int k,bool & flag ,vector<vector<char>>& b,string & w){
if(b[x][y] != w[k])
return false;
if(k + 1 == w.size())
return true;
vis[x][y] = true;
bool f = true;
for(int i = 0; i < 4; ++i)
{
int dx = x + dir[0][i];
int dy = y + dir[1][i];
if( check(dx,dy) && !vis[dx][dy] && !dp[i][x][y][k])
{
if(w[k + 1] == b[dx][dy])
{
if(dfs(dx,dy,k + 1,f,b,w))
return true;
dp[i][x][y][k] = f;
}
else dp[i][x][y][k] = true;
flag &= dp[i][x][y][k];
}
if(check(dx,dy) && vis[dx][dy])
flag = false;
}
vis[x][y] = false;
return false;
}
bool exist(vector<vector<char>>& board, string word) {
n = board.size(),m = board[0].size();
bool flag = true;
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < m; ++j)
{
if(dfs(i,j,0,flag,board,word))
return true;
}
}
return false;
}

浙公网安备 33010602011771号