时间限制: 1 s
空间限制: 32000 KB
题目等级 : 黄金 Gold
题目描述 Description
小刚在迷宫内,他需要从A点出发,按顺序经过B,C,D……,到达最后一个点,再回到A点。迷宫内有些障碍,问至少走几步。
输入描述 Input Description
第一行有三个数n,m表示迷宫有n行,m列。
第2行到第n+1行,每行m个字符,可能是’A’..’Z’,’2’,’0’ 其中,2表示障碍,0表示可以走。’A’..’Z’也可以走。
输出描述 Output Description
至少走几步可以按规定走完,如果不行,输出“Impossible”
样例输入 Sample Input
5 5
A002B
022C0
000D0
00222
0000E
样例输出 Sample Output
26
数据范围及提示 Data Size & Hint
0%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“B”。
30%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“G”。
50%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“Z”。
10%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“B”。
30%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“G”。
100%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“Z”。
bfs
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> using namespace std; struct node { int x,y; char ch; }zm[27]; int fx[5]={1,-1,0,0},fy[5]={0,0,-1,1}; int h,tot,n,m,i,j; bool vis[101][101]; char atlas[101][101]; bool cmp(node a,node b) { return int(a.ch)<int(b.ch); } int dfs(int sx,int sy,int ox,int oy) { int f[10001][3],head=0,tail=1; f[tail][1]=sx; f[tail][2]=sy; f[tail][3]=1; vis[sx][sy]=1; do { head++; int x=f[head][1],y=f[head][2]; for(int k=0;k<4;++k) { int lx=x+fx[k],ly=y+fy[k]; if(lx>=0&&lx<n&&ly>=0&&ly<m&&!vis[lx][ly]&&atlas[lx][ly]!='2') { f[++tail][1]=lx; f[tail][2]=ly; f[tail][3]=f[head][3]+1; vis[lx][ly]=1; if(lx==ox&&ly==oy) return f[head][3]; } } }while(head<=tail); return 0; } int main() { scanf("%d%d",&n,&m); for(i=0;i<n;++i) { for(j=0;j<m;++j) { cin>>atlas[i][j]; if(atlas[i][j]>='A'&&atlas[i][j]<='Z') { zm[tot].x=i; zm[tot].y=j; zm[tot].ch=atlas[i][j]; tot++; } } } sort(zm,zm+tot,cmp); for(i=0;i<tot;++i) { if(i<tot-1) { memset(vis,0,sizeof(vis)); int k=dfs(zm[i].x,zm[i].y,zm[i+1].x,zm[i+1].y); if(k) h+=k; else { printf("Impossible"); return 0; } } else { memset(vis,0,sizeof(vis)); int k=dfs(zm[i].x,zm[i].y,zm[0].x,zm[0].y); if(k) h+=k; else { printf("Impossible"); return 0; } } } printf("%d",h); return 0; }