poj 3984 迷宫问题(BFS+路径输出)

来源:互联网 发布:长春一台网络直播 编辑:程序博客网 时间:2024/06/05 04:21
迷宫问题
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 16571 Accepted: 9882

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)

tip:关键在于正序输出路径,结构体数组的下标表示当前点的坐标,px,py表示上一个点的坐标;

输出路径时使用递归;

#include<cstring>#include<queue>#include<iostream>using namespace std;int map[15][15];int book[51][15];int dire[4][2]={-1,0,1,0,0,-1,0,1};int fx[10][10];int fy[10][10];struct node{int x,y;};void printpath(int x,int y){if(x==0&&y==0){cout<<"("<<0<<", "<<0<<")"<<endl; return;}printpath(fx[x][y],fy[x][y]);cout<<"("<<x<<", "<<y<<")"<<endl;}void bfs(){queue<node>q;book[0][0]=1;q.push(node{0,0});while(!q.empty()){node t=q.front();q.pop();int x=t.x;int y=t.y;if(x==4&&y==4){ printpath(4,4);return;}for(int i=0;i<4;i++){int nx=x+dire[i][0];int ny=y+dire[i][1];if(nx<0||nx>4||ny<0||ny>4)continue;if(!book[nx][ny]&&!map[nx][ny]){book[nx][ny]=1;fx[nx][ny]=x;fy[nx][ny]=y;q.push(node{nx,ny});//book[nx][ny]=0;}}}}int main(){for(int i=0;i<5;i++)for(int j=0;j<5;j++)  cin>>map[i][j];bfs();return 0; }
#include<iostream>#include<queue>using namespace std;int map[5][5];int book[5][5];//用于标记数组int dire[4][2]={-1,0,1,0,0,-1,0,1};//下一步搜索方向struct point{int x,y;int px,py;point(int a=0,int b=0):x(a),y(b){}}a[10][10];//记录上一点的坐标void bfs(){queue<point>q;a[0][0].px=-1;a[0][0].py=-1;book[0][0]=1;q.push(point(0,0));while(!q.empty()){point t=q.front();if(t.x==t.y&&t.x==4)break;q.pop();for(int i=0;i<4;i++){int nx=t.x+dire[i][0];int ny=t.y+dire[i][1];if(nx<0||nx>4||ny<0||ny>4)continue;if(!book[nx][ny]&&map[nx][ny]==0){book[nx][ny]=1;a[nx][ny].px=t.x;a[nx][ny].py=t.y;q.push(point(nx,ny));}}}}//递归输出路径void display(int x,int y){if(a[x][y].px!=-1&&a[x][y].py!=-1)display(a[x][y].px,a[x][y].py);cout<<"("<<x<<", "<<y<<")"<<endl;}int main(){for(int i=0;i<5;i++)for(int j=0;j<5;j++)cin>>map[i][j];bfs();display(4,4);return 0;}


                                             
0 0
原创粉丝点击