牛客寒假算法基础集训营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 }

 

posted @ 2019-02-01 11:26  Frontierone  阅读(197)  评论(0编辑  收藏  举报