题目描述
Simple最近刷题(打游戏)刷多了,一觉醒来发现自己到了一个迷宫里,怎么也出不去了。这时传来了一句话,告诉Simple必须按顺序收集完所有的宝石,才能出迷宫。所谓的顺序,就是按照每块宝石上英文字母的顺序。迷宫里面还有一些传送门,可以传送到任意一个另外的传送门的位置。(你走到一个不是空地上的地方的时候,就一定会触发相应事件,不可拒绝,从一个传送门传送到另一个传送门不用再次传送)。每走一步花费一个单位时间,传送门到另外一个传送门不需要时间。Simple初始就在字母为A的宝石的位置上(开局一宝石,其他全靠找)。
当Simple收集完所有宝石的时候就被传送出迷宫。
Simple还要赶回去刷题(打游戏),你们能告诉他最少需要多长时间才能回去吗?如果不可能出去就输出Impossible。 输入
多组实例,每组输入一个n,表示迷宫的大小为n*n (n <= 10) 下面n行每行n个字符 ‘.’表示空地, ‘#’表示墙,不可以通过 ‘$’表示一个传送门 大写字母表示宝石
输出
每个实例输出一个数字,表示最少需要的时间,如果不能逃出迷宫,就输出Impossible。 样例输入
5 A….
..B.. .#### C.DE.
2 AC .B
2 A#
3 A .…. B 样例输出
15 3 Impossible 2
zz 了,这种题就是烦人,让你知道大致思路,然后我一直wa。
标程思路 还是很清晰的。自己写的时候总是zz【学习一波bfs的标准操作】
代码
#include<bits/stdc++.h> #define LL long long using namespace std; const int MAXN = 1e2; const int MAXM = 1e5; struct Door{ int x,y; }d[MAXN]; struct Node{ int x,y,step,cnt; }; int dcnt,nsize; int n,m; char mp[MAXN][MAXN]; Node S; void getmap(){ getchar(); dcnt=0;nsize=0; for(int i=0;i<n;i++){ scanf("%s",mp[i]); for(int j=0;j<n;j++){ if(mp[i][j]=='$') d[dcnt++]={i,j}; if(mp[i][j]=='A') S={i,j,0,1}; if(mp[i][j]>='A'&&mp[i][j]<='Z') nsize++; } getchar(); } } int vis[MAXN][MAXN]; int to[][2]={1,0,-1,0,0,1,0,-1}; void bfs(){ queue<Node >Q; memset(vis,0,sizeof(vis)); vis[S.x][S.y]=1;Q.push(S); Node now,nexts; while(!Q.empty()){ now=Q.front();Q.pop(); if(now.cnt==nsize) { printf("%d\n",now.step); return ;} for(int i=0;i<4;i++){ int nx=now.x+to[i][0]; int ny=now.y+to[i][1]; if(nx<0||ny<0||nx>=n||ny>=n) continue; if(vis[nx][ny]||mp[nx][ny]=='#') continue; if(mp[nx][ny]=='$') { for(int j=0;j<dcnt;j++){ if(vis[d[j].x][d[j].y]) continue; if(nx==d[j].x&&ny==d[j].y) continue; nexts={d[j].x,d[j].y,now.step+1,now.cnt}; vis[d[j].x][d[j].y]=1; Q.push(nexts); } continue; } if(mp[nx][ny]>='A'&&mp[nx][ny]<='Z'&&mp[nx][ny]>'A'+now.cnt) continue;//没有走过的宝石不能够走 if(mp[nx][ny]>='A'&&mp[nx][ny]<='Z'&&mp[nx][ny]=='A'+now.cnt) { nexts={nx,ny,now.step+1,now.cnt+1}; while(!Q.empty()) Q.pop(); memset(vis,0,sizeof(vis)); vis[nx][ny]=1; Q.push(nexts); break; } nexts={nx,ny,now.step+1,now.cnt}; vis[nx][ny]=1; Q.push(nexts); } } puts("Impossible"); } int main(){ while(scanf("%d",&n)!=EOF){ getmap(); bfs(); } return 0; }