1.冬冬走迷宫
time limit:1s
memory limit:128 MB
众所周知,冬冬是一个土豪以及游戏狂热玩家。最近他趁着暑假,买了许多游戏来消遣。可是当他把所有游戏都通关了以后,感到无敌是多么寂寞,必须靠经典才能满足他。于是他又玩起了走迷宫的小游戏。
走迷宫可以简化为一个矩阵,里面含n*m个格子。有些格子是可以进入并且通过的,有些格子内含障碍物,是不能进入通过它的。我们的任务就是在给定一个起点S和一个终点T后,选择一个不经过障碍物以及走出矩阵边界的方案,把自己控制的角色从S走到T。
然而冬冬身经百战,不知道比其他人高到哪里去了,因此他总会选择最短的路径来走完这个迷宫。可是他不能确定自己的路径是不是最短的,因此他希望你能帮助他,给出每个迷宫的最短路径长度(即从S到T经过(包含S和T)的格子数)。
作为新晋ACMer,你能帮助冬冬完成这个任务吗?
Input
多组数据输入,保证格子总数不超过100w。
第一行是两个正整数n,m,代表矩阵的高度和宽度。其中0≤n,m≤100.
接下来n行m列,给出迷宫每个格子的情况。'S'代表起点,'T'代表终点,'#'代表障碍物,'.'代表可通行区域。
Output
对于每组数据,输出一行从S到T的最短路径的长度。若无从S到T的路径,则输出“Impossible”。
Sample Input
5 6
S.....
#.###.
##.T..
#.###.
#.....
2 9
S.#......
###T####.
Sample Output
10
Impossible
一道很基础的bfs题,除了迷宫的地图数组外,加入标记数组,步数数组,bfs时让每个格子向四周扩展,把没有标记的格子以及他的步数加入队列中并标记他们,还需在步数数组上记录到该点的步数,直至队列中没有元素为止(或者bfs到T点就跳出循环)。最后检查下终点T有无被标记过。没有则是Impossible,有则输出T点的步数。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<queue> 5 #define clr_1(x) memset(x,-1,sizeof(x)) 6 #define clr(x) memset(x,0,sizeof(x)) 7 using namespace std; 8 struct node 9 { 10 int x,y,step; 11 }u,v; 12 queue<node> que; 13 char s[200]; 14 int map[200][200]; 15 int stepm[200][200]; 16 int dirx[4]={0,0,-1,1},diry[4]={1,-1,0,0}; 17 int n,m,t,k,sx,sy,tx,ty; 18 void init() 19 { 20 clr(map); 21 for(int i=1;i<=n;i++) 22 { 23 scanf("%s",s); 24 for(int j=0;j<strlen(s);j++) 25 { 26 if(s[j]=='S') 27 { 28 sx=i; 29 sy=j+1; 30 map[i][j+1]=1; 31 } 32 if(s[j]=='T') 33 { 34 tx=i; 35 ty=j+1; 36 map[i][j+1]=1; 37 } 38 if(s[j]=='.') 39 { 40 map[i][j+1]=1; 41 } 42 } 43 } 44 while(!que.empty()) 45 que.pop(); 46 return ; 47 } 48 void bfs() 49 { 50 while(!que.empty()) 51 { 52 u=que.front(); 53 que.pop(); 54 for(int i=0;i<4;i++) 55 { 56 v=u; 57 v.x+=dirx[i]; 58 v.y+=diry[i]; 59 v.step++; 60 if(map[v.x][v.y]==1) 61 { 62 map[v.x][v.y]=0; 63 stepm[v.x][v.y]=v.step; 64 que.push(v); 65 } 66 } 67 68 } 69 return ; 70 } 71 int main() 72 { 73 freopen("1.in","r",stdin); 74 freopen("1.out","w",stdout); 75 while(scanf("%d%d",&n,&m)!=EOF) 76 { 77 init(); 78 u.x=sx; 79 u.y=sy; 80 u.step=1; 81 map[sx][sy]=0; 82 que.push(u); 83 bfs(); 84 if(map[tx][ty]==1) 85 { 86 printf("Impossible\n"); 87 } 88 else 89 { 90 printf("%d\n",stepm[tx][ty]); 91 } 92 } 93 return 0; 94 }