POJ 3984 迷宫问题
来源:互联网 发布:js input file value 编辑:程序博客网 时间:2024/06/05 03:10
定义一个二维数组:
它表示一个迷宫,其中的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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
左上角到右下角的最短路径,格式如样例所示。
0 1 0 0 00 1 0 1 00 0 0 0 00 1 1 1 00 0 0 1 0
(0, 0)(1, 0)(2, 0)(2, 1)(2, 2)(2, 3)(2, 4)(3, 4)(4, 4)
这道题和其他题有点不一样,一般都只是要求出最少步数即可,而这题要求啊我们输出路径。难免会有点棘手。这里给出三种方法:深搜,广搜,其中广搜有数组模拟队列实现和运用stl队列实现。
//深搜#include<stdio.h>#include<string.h>#include<queue>using namespace std;int flag,a[6][6],dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};bool vis[6][6];struct node{ int x,y;}s[30];bool can(int x,int y){ if(x<0||x>4||y<0||y>4||vis[x][y]||a[x][y]==1) return false; return true;}void dfs(int x,int y,int step){ s[step].x=x,s[step].y=y;//记录路径 if(x==4&&y==4) { flag=1; for(int i=0;i<=step;i++)//输出路径 printf("(%d, %d)\n",s[i].x,s[i].y); return ; } for(int i=0;i<4;i++) { int tx=x+dir[i][0]; int ty=y+dir[i][1]; if(can(tx,ty)) { vis[tx][ty]=true; dfs(tx,ty,step+1); vis[tx][ty]=false; if(flag) return ; } }}int main(){ for(int i=0;i<5;i++) for(int j=0;j<5;j++) scanf("%d",&a[i][j]); flag=0; dfs(0,0,0);}
//广搜(数组模拟)#include<stdio.h>#include<string.h>#include<stdio.h>#include<string.h>#include<queue>using namespace std;int head,tail,a[6][6],dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};bool vis[6][6];struct node{ int x,y,path,step;}que[30];bool can(int x,int y){ if(x<0||x>4||y<0||y>4||vis[x][y]||a[x][y]==1) return false; return true;}void put(int x){ if(que[x].path!=-1)//倒向输出路径 { put(que[x].path); printf("(%d, %d)\n",que[x].x,que[x].y); }}int main(){ for(int i=0;i<5;i++) for(int j=0;j<5;j++) scanf("%d",&a[i][j]); printf("(0, 0)\n"); int head=0,tail=0; vis[0][0]=true; que[tail].x=que[tail].y=que[tail].step=0; que[tail].path=-1; tail++; while(head<tail) { for(int i=0;i<4;i++) { int tx=que[head].x+dir[i][0]; int ty=que[head].y+dir[i][1]; if(can(tx,ty)) { que[tail].x=tx; que[tail].y=ty; que[tail].step=que[head].step+1; que[tail++].path=head; vis[tx][ty]=true; } if(tx==4&&ty==4) {// printf("%d\n",que[tail-1].step);//这里可以输出最少的步数 put(head); printf("(4, 4)\n"); return 0; } } head++; }}
//广搜(stl)#include<stdio.h>#include<string.h>#include<queue>using namespace std;int a[6][6],dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};bool vis[6][6];bool can(int x,int y){ if(x<0||x>4||y<0||y>4||vis[x][y]==true||a[x][y]==1) return false; return true;}struct node{ int x,y,step,pre[30];}start;node bfs(){ queue<node>q; start.x=0; start.y=0; start.step=0; q.push(start); vis[start.x][start.y]=true; node now,net; while(!q.empty()) { now=q.front(); q.pop(); if(now.x==4&&now.y==4) return now; for(int i=0;i<4;i++) { int nx=now.x+dir[i][0]; int ny=now.y+dir[i][1]; if(can(nx,ny)) { net=now; net.x=nx; net.y=ny; net.step=now.step+1; net.pre[now.step]=i; vis[nx][ny]=true; q.push(net); } } } return now;}int main(){ for(int i=0;i<5;i++) for(int j=0;j<5;j++) scanf("%d",&a[i][j]); node ans=bfs(); int x=0,y=0; for(int i=0;i<=ans.step;i++) { printf("(%d, %d)\n",x,y); x+=dir[ans.pre[i]][0]; y+=dir[ans.pre[i]][1]; }}若有错误请大牛指出!
阅读全文
0 0
- poj 3984 迷宫问题
- poj 3984 迷宫问题
- POJ-3984-迷宫问题
- Poj 3984 迷宫问题
- 迷宫问题 poj 3984
- poj 3984迷宫问题
- poj 3984 迷宫问题
- POJ-3984-迷宫问题
- poj 3984- 迷宫问题
- POJ 3984 迷宫问题
- poj 3984 迷宫问题
- poj 3984:迷宫问题
- POJ-3984-迷宫问题
- POJ 3984 迷宫问题
- poj 3984迷宫问题
- POJ 3984 迷宫问题
- POJ 3984 迷宫问题
- poj 3984 迷宫问题
- 贝尔宾团队角色理论及实践
- 线性探测法的查找函数
- Android 运行时权限
- eclipse 快捷键
- gitlab+docker+jenkins+maven+tomcat持续集成
- POJ 3984 迷宫问题
- js时间
- 数组
- oracle归档日志满了处理方式
- 线性回归算法学习
- 【Python】互斥锁
- Ubuntu Linux下安装JDK,Android SDK,Android Studio以及NDK
- 《Head First 设计模式》【PDF】下载
- yii入门