1254:走出迷宫
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。
【输入】
第一行是两个整数n和m(1≤n,m≤100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符‘.’表示空地,‘#’表示墙,‘S’表示起点,‘T’表示出口。
【输出】
输出从起点到出口最少需要走的步数。
【输入样例】
3 3
S#T
.#.
...
【输出样例】
6
1. #include <iostream> 2. #include <cstdio> 3. #include <cstring> 4. #include <algorithm> 5. using namespace std; 6. char t; 7. int n,m,x2,y2; 8. int map[102][102],p[10001][4]; 9. int x3[4]={-1,1,0,0}; 10. int y3[4]={0,0,-1,1}; 11. void bfs(){ 12. int x,y,t=0,w=1; 13. while(w>t){ 14. t++; 15. for(int i=0;i<4;i++){ 16. x=p[t][1]+x3[i]; 17. y=p[t][2]+y3[i]; 18. if(x>0&&x<=n&&y>0&&y<=m&&map[x][y]==0){ 19. w++;p[w][1]=x;p[w][2]=y; 20. p[w][3]=p[t][3]+1;map[x][y]=1; 21. if(x==x2&&y==y2){ 22. printf("%d\n",p[w][3]); 23. return ; 24. } 25. } 26. } 27. } 28. } 29. int main(int argc, char *argv[]) 30. { 31. scanf("%d %d",&n,&m); 32. memset(map,0,sizeof(map)); 33. for(int i=1;i<=n;i++) 34. for(int j=1;j<=m;j++){ 35. cin>>t; 36. if(t=='S'){p[1][1]=i;p[1][2]=j;p[1][3]=0;map[i][j]=1;} 37. else if(t=='T'){x2=i;y2=j;} 38. else if(t=='#') map[i][j]=1; 39. } 40. bfs(); 41. return 0; 42. }