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;
}
posted @ 2022-07-25 22:12  Figure_at_a_Window  阅读(23)  评论(0)    收藏  举报