迷宫问题
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 11362 | Accepted: 6796 |
Description
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
思路:用pre来记录从左上角到右下角的最短路径中一个元素的前一个元素的下标,最后递归求出结果;
代码:
#include<stdio.h> #include<queue> #include<algorithm> using namespace std; struct record { int x,y,pre; }q[100]; int dx[4]={0,0,1,-1}; int dy[4]={-1,1,0,0}; int map[5][5]; int front,rear; //front前一位,rear后一位; void print(int i) //输出结果; { if(q[i].pre!=-1) { print(q[i].pre); printf("(%d, %d)\n",q[i].x,q[i].y); } } void bfs() { int i,xx,yy; front=0;rear=1; map[0][0]=1; q[front].x=0; q[front].y=0; q[front].pre=-1; while(front<rear) { for(i=0;i<4;i++) //四个方向进行搜索 { xx=q[front].x+dx[i]; yy=q[front].y+dy[i]; if(xx>=0&&xx<5&&yy>=0&&yy<5&&!map[xx][yy]) //是否满足条件; { map[xx][yy]=1; //已访问; q[rear].x=xx; q[rear].y=yy; q[rear].pre=front; //记录前一个元素的下标; rear++; } if(xx==4&&yy==4) //到右下角,输出; { print(front); } } front++; } } int main() { int i,j; for(i=0;i<5;i++) { for(j=0;j<5;j++) { scanf("%d",&map[i][j]); } } printf("(0, 0)\n"); bfs(); printf("(4, 4)\n"); return 0; }