2 条题解
-
-2
设置当前状态是否有拿过钥匙
#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
- 难度
- 7
- 标签
- (无)
- 递交数
- 64
- 已通过
- 13
- 上传者