P3750. 迷宫

本题思路

dfs。需要回溯。

回溯:对结果的试探和纠正

代码

void solve() {
    int n,m, t; cin>>n>>m>>t; // 读入 n m t
    int sx,sy,ex,ey; cin>>sx>>sy>>ex>>ey; // 读入 起始x,y,结束x,y
    vector<vector<int>> ph(n+1, vector<int>(m+1));
    auto vis(ph); 
    for(int i = 0; i < t; ++i) {
        int x,y; cin>>x>>y;
        ph[x][y] = 1; // 将障碍物坐标位置设置为1
    }
    vector<int> fx({0,0,1,-1}), fy({1,-1, 0, 0}); // 四个方向
    int cnt = 0; // 结果计数
    auto dfs = [&](auto &&dfs, int x, int y) -> void { // dfs
        if(x == ex && y == ey) { // 如果当前位置等于结束位置,计数+1
            cnt++;
            return ;
        }
        for(int i = 0; i < 4; ++i) { // 四个方向
            int xx = x + fx[i], yy = y + fy[i];
            if(xx < 1 || xx > n || yy < 1 || yy > m) continue; // 不在二维范围内,continue
            if(ph[xx][yy]) continue; // 是障碍物,continue
            if(vis[xx][yy]) continue; // 访问过,continue
            // dbgnb(x)
            // dbgnb(y)
            vis[xx][yy] = 1; // 置1
            dfs(dfs, xx,yy);
            vis[xx][yy] = 0; // 回溯
        }
    };
    vis[sx][sy] = 1;
    dfs(dfs, sx,sy);
    cout<<cnt;
}

你可能感兴趣的:(算法题,深度优先,算法)