1252:走迷宫
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。
给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。
【输入】
第一行是两个整数,R和C,代表迷宫的长和宽。( 1≤ R,C ≤ 40)
接下来是R行,每行C个字符,代表整个迷宫。
空地格子用‘.’表示,有障碍物的格子用‘#’表示。
迷宫左上角和右下角都是‘.’。
【输出】
输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。
【输入样例】
5 5
..###
#....
#.#.#
#.#.#
#.#..
【输出样例】
9
1. #include <iostream> 2. #include <cstdio> 3. #include <cstring> 4. using namespace std; 5. int dt[42][42],book[300][3]; 6. int r,c; 7. int xx[4]={-1,1,0,0}; 8. int yy[4]={0,0,-1,1}; 9. void bfs(int a,int b){ 10. int x,y,t=0,w=1;dt[a][b]=1; 11. book[1][1]=a;book[1][2]=b;book[1][3]=0; 12. while(w>t){ 13. t++; 14. for(int i=0;i<4;i++){ 15. x=book[t][1]+xx[i]; 16. y=book[t][2]+yy[i]; 17. if(x>0&&x<=r&&y>0&&y<=c&&dt[x][y]==0){ 18. w++;dt[x][y]=1; 19. book[w][1]=x;book[w][2]=y;book[w][3]=book[t][3]+1; 20. if(x==r&&y==c){ 21. printf("%d\n",book[w][3]+1);return; 22. } 23. } 24. } 25. } 26. } 27. int main(int argc, char *argv[]) 28. { 29. char ch; 30. scanf("%d %d",&r,&c); 31. for(int i=1;i<=r;i++) 32. for(int j=1;j<=c;j++){ 33. cin>>ch; 34. if(ch=='#')dt[i][j]=1; 35. else dt[i][j]=0; 36. } 37. bfs(1,1); 38. return 0; 39. }