POJ 3984 迷宫问题 (路径记录)

来源:互联网 发布:为什么淘宝店铺进不去 编辑:程序博客网 时间:2024/05/17 01:48
K - 迷宫问题
Crawling in process...Crawling failedTime Limit:1000MS    Memory Limit:65536KB    64bit IO Format:%I64d & %I64u
SubmitStatus

Description

定义一个二维数组:        
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 00 1 0 1 00 0 0 0 00 1 1 1 00 0 0 1 0

Sample Output

(0, 0)(1, 0)(2, 0)(2, 1)(2, 2)(2, 3)(2, 4)(3, 4)(4, 4)

 

 

刚学的记录路径。

不过BFS的部分不是我以前那种写法,还是感觉有点生涩。

其他大体上差不多吧。

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};int map[6][6];int rear=1;int front=0;struct node{int x,y;int pre;};node q[36];void output(int i){if(q[i].pre!=-1){output(q[i].pre);//用递归输出路径。printf("(%d, %d)\n",q[i].x,q[i].y);}}void bfs(int x,int y){int i;q[front].x=x;q[front].y=y;q[front].pre=-1;map[x][y]=1;while(front<rear){for(i=0;i<4;i++){int nx=q[front].x+dir[i][0];int ny=q[front].y+dir[i][1];if(nx>=5 ||nx<0 ||ny>=5 ||ny<0 ||map[nx][ny])continue;map[nx][ny]=1;q[rear].x=nx;q[rear].y=ny;q[rear++].pre=front;//入队+记录路径。if(nx==4 &&ny==4)output(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(0,0);printf("(4, 4)\n");}

 

又学了种自己熟悉的写法。


 简单清楚。。

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#include <queue>int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};int map[10][10];struct node{intx,y;};node pre[10][10];bool check(int x,int y){if(x>=5 ||y>=5 ||x<0||y<0||map[x][y])return 0;return 1;}void find(node now){if(now.x==0 &&now.y==0){printf("(%d, %d)\n",now.x,now.y);return;}find(pre[now.x][now.y]);printf("(%d, %d)\n",now.x,now.y);}void bfs(){    queue<node>q;node st,ed;st.x=0;st.y=0;int i;q.push(st);while(!q.empty()){st=q.front();q.pop();if(st.x==4 &&st.y==4)break;for(i=0;i<4;i++){ed.x=st.x+dir[i][0];ed.y=st.y+dir[i][1];if(!check(ed.x,ed.y))continue;map[ed.x][ed.y]=1;pre[ed.x][ed.y]=st;q.push(ed);}}find(st);}int main(){int i,j;for(i=0;i<5;i++)for(j=0;j<5;j++)scanf("%d",&map[i][j]);map[0][0]=1;bfs();}


 

0 0
原创粉丝点击