首页 > 代码库 > POJ 3984 路径输出
POJ 3984 路径输出
迷宫问题
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)
Source
思路:bfs+输出路径
代码:
1 #include "cstdio" 2 #include "stdlib.h" 3 #include "iostream" 4 #include "algorithm" 5 #include "string" 6 #include "cstring" 7 #include "queue" 8 #include "cmath" 9 #include "vector" 10 #include "map" 11 #include "set" 12 #define mj 13 #define db double 14 #define ll long long 15 using namespace std; 16 const int N=1e8+2; 17 const int mod=1e9+7; 18 const ll inf=1e16+10; 19 typedef pair<int,int> P; 20 vector<P> m; 21 queue<P> q; 22 P fa[12][12]; 23 24 int s[12][12]; 25 int d[12][12]; 26 int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1}; 27 void pt(P u){ 28 while(1){ 29 m.push_back(u);//从后往前找父节点 30 if(u==P(0,0)) break;//根节点 31 u=fa[u.first][u.second]; 32 } 33 for(int i=(int)m.size()-1;i>=0;i--)//从根节点开始依次输出路径 34 printf("(%d, %d)\n",m[i].first,m[i].second); 35 } 36 void bfs() 37 { 38 for(int i=0;i<5;i++){ 39 for(int j=0;j<5;j++){ 40 d[i][j]=N; 41 } 42 } 43 q.push(P(0,0)); 44 d[0][0]=0; 45 while(q.size()){ 46 P p; 47 p=q.front(),q.pop(); 48 if(p.first==4&&p.second==4) { 49 pt(p); 50 return; 51 } 52 for(int i=0;i<4;i++){ 53 int nx=p.first+dx[i],ny=p.second+dy[i]; 54 if(0<=nx&&nx<5&&0<=ny&&ny<5&&!s[nx][ny]&&d[nx][ny]==N){ 55 d[nx][ny]=d[p.first][p.second]+1; 56 fa[nx][ny]=p;/保存 57 q.push(P(nx,ny)); 58 } 59 } 60 61 62 } 63 } 64 int main() 65 { 66 memset(s,-1, sizeof(s)); 67 for(int i=0;i<5;i++){ 68 for(int j=0;j<5;j++){ 69 scanf("%d",&s[i][j]); 70 } 71 } 72 bfs(); 73 return 0; 74 }
POJ 3984 路径输出
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。