2 条题解

  • -1
    @ 2023-12-17 15:46:02

    设置当前状态是否有拿过钥匙

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 2010;
    typedef pair<int,int> pii;
    typedef pair<pii,int> piii;
    int dx[4] = {1,0,0,-1},dy[4] = {0,1,-1,0};
    char g[N][N];
    int bx, by, ex, ey;
    int d[N][N];
    int vis[N][N][2];
    int n, m;
    bool in(int x,int y){
        return x > 0 && x <= n && y > 0 && y <= m;
    }
    
    void bfs(){
        queue<pii> q;
        q.push({bx,by});
        vis[bx][by][0] = 1;
        while(!q.empty()){
            pii t = q.front();
            q.pop();
            int x = t.first, y = t.second;
            if(g[x][y] == 'P'){
                vis[x][y][1] = vis[x][y][0];//将这个继承上去。
            }
            if(g[x][y] == 'T' && vis[x][y][1]){
                cout << vis[x][y][1] - 1;
                return;
            }
            for (int i = 0; i < 4; i ++){
                int tx = x + dx[i], ty = y + dy[i];
                if(in(tx, ty) && g[tx][ty] != '#'){//如果tx,ty在范围里面
                    if(vis[x][y][1] && !vis[tx][ty][1]){//如果之前的位置是已经拿过钥匙了,而这个位置没拿过钥匙,那我也可以更新。
                        vis[tx][ty][1] = vis[x][y][1] + 1;//步数+1
                        q.push({tx,ty});
                    }
                    if(!vis[tx][ty][0]){
                        vis[tx][ty][0] = vis[x][y][0] + 1;
                        q.push({tx,ty});
                    }
                }
            }
        }
    }
    int main(){
        freopen("home.in","r",stdin);
        freopen("home.out","w",stdout);
        cin >> n >> m;
        for (int i = 1; i <= n; i ++){
            for (int j = 1; j <= m; j ++){
                cin >> g[i][j];
                if(g[i][j] == 'S'){
                    bx = i, by = j;
                }
            }
        }
        bfs();
        return 0;
    }
    

    信息

    ID
    559
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    63
    已通过
    12
    上传者