牛客寒假算法基础集训营4 C Applese 走迷宫
链接:https://ac.nowcoder.com/acm/contest/330/C
来源:牛客网
精通程序设计的 Applese 双写了一个游戏。
在这个游戏中,它被困在了一个 n×m迷宫
在迷宫中,有一些方格是水池,只有当 Applese 处于水属性的时候才可以通过;有一些方格是岩浆,只有当 Applese 是火属性的时候可以通过;有一些方格是墙壁,无论如何都无法通过;另一些格子是空地(包括起点和终点),可以自由通过
在一些空地上有神秘道具可以让 Applese 转换自己的属性(从水属性变为火属性或从火属性变为水属性,需要一个单位的时间)。
已知 Applese 在一个单位的时间内可以朝四个方向行走一格,且开始处于水属性,位于空地的道具拾取后只能在该处立即使用(或者不使用),且可以多次使用。求它走出迷宫需要的最少时间
开三维数组,vis[x][y][0/1] 然后模拟即可
有一点不是太明白,判断条件有个vis未被访问,也就是一个点最多过两次????
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m; 4 typedef pair<pair<int,int>, int> Node; 5 const int maxn=110; 6 char g[maxn][maxn]; 7 int vis[maxn][maxn][2]; 8 int des[4][2]={-1,0,0,-1,1,0,0,1}; 9 10 int bfs(pair<int,int> S,pair<int,int> T) { 11 memset(vis,-1,sizeof(vis)); 12 queue<Node> q; 13 q.push({S,0}); 14 vis[S.first][S.second][0]=0; 15 while(!q.empty()) { 16 Node tmp=q.front(); 17 q.pop(); 18 int x=tmp.first.first,y=tmp.first.second; 19 bool p=tmp.second; 20 for(int i=0;i<4;i++) { 21 int nx=x+des[i][0]; 22 int ny=y+des[i][1]; 23 if(nx<0||nx>=n||ny<0||ny>=m) continue; 24 if(~vis[nx][ny][p]) continue; 25 if(g[nx][ny]=='#') continue; 26 if(p&&g[nx][ny]=='~') continue; 27 if(!p&&g[nx][ny]=='w') continue; 28 vis[nx][ny][p]=vis[x][y][p]+1; 29 pair<int,int> nxt={nx,ny}; 30 if(nxt==T) return vis[nx][ny][p]; 31 q.push({nxt,p}); 32 } 33 if(g[x][y]=='@'&&vis[x][y][p^1]==-1) { 34 vis[x][y][p^1]=vis[x][y][p]+1; 35 q.push({tmp.first,p^1}); 36 } 37 } 38 return -1; 39 } 40 41 int main() { 42 pair<int,int> S,T; 43 scanf("%d%d",&n,&m); 44 for(int i=0;i<n;i++) scanf("%s",g[i]); 45 for(int i=0;i<n;i++) { 46 for(int j=0;j<m;j++) { 47 if(g[i][j]=='S') { 48 S={i,j}; 49 } 50 else if(g[i][j]=='T') { 51 T={i,j}; 52 } 53 } 54 } 55 int ans=bfs(S,T); 56 printf("%d\n",ans); 57 return 0; 58 }
埋骨何须桑梓地,人生无处不青山