博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3984迷宫问题【广搜】
阅读量:6127 次
发布时间:2019-06-21

本文共 2635 字,大约阅读时间需要 8 分钟。

迷宫问题
Time Limit:1000MS   Memory Limit:65536K
Total Submissions:3850   Accepted:2226

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)
总结:用队列来实现广搜,如果有输出方向的要求,可以用last_dir[][]记录但因该注意栈溢出的问题。
code:
 
View Code
#include
#include
int dx[4]={-1,0,0,1},dy[4]={
0,-1,1,0}; int q[100000]; int maze[5][5]; int vis[5][5]; int dist[5][5]; int fa[5][5]; void bfs(int x,int y) { int front=0,rear=0,d,u; u=x*5+y; vis[x][y]=1; dist[x][y]=0; q[rear++]=u; fa[x][y]=u; while(front
=0&&nx<5&&ny>=0&&ny<5&&!maze[nx][ny]&&!vis[nx][ny]) { int v=nx*5+ny; q[rear++]=v; vis[nx][ny]=1; fa[nx][ny]=u; //保存新格子(nx,ny)父亲编号 dist[nx][ny]=dist[x][y]+1; //last_dir[nx][ny]=d; //保存父亲节点到他的移动方向 } } } } void print_path(int x,int y) { int fx=fa[x][y]/5; int fy=fa[x][y]%5; if(fx!=x||fy!=y) { printf("(%d, %d)\n",fx,fy); print_path(fx,fy); //putchar(name[last_dir[x][y]]); } } int main() { int i,j; memset(maze,0,sizeof(maze)); memset(vis,0,sizeof(vis)); memset(dist,0,sizeof(dist)); memset(q,0,sizeof(q)); for(i=0;i<5;i++) for(j=0;j<5;j++) scanf("%d",&maze[i][j]); bfs(4,4); printf("(0, 0)\n"); print_path(0,0); return 0; }
View Code
补充: void print_path(int x,int y) {    int fx=fa[x][y]/5;    int fy=fa[x][y]%5;    if(fx!=x||fy!=y)        {                printf("(%d, %d)\n",fx,fy);                print_path(fx,fy);        } }   //用到了递归的技巧:如果格子(x,y)有父亲(fx,fy),打印之。非递归形式:
View Code
int dir[maxn*maxn]; void print_path(int x,int y) {    int c=0;    for(;;)        {        int fx=fa[x][y]/m;        int fy=fa[x][y]%m;        if(fx==x&&fy==y)            break;                dir[c++]=last_dir[x][y];                x=fx;                y=fy;    }   while(c--)                putchar(name[dir[c]]); }
 

转载于:https://www.cnblogs.com/dream-wind/archive/2012/03/15/2397818.html

你可能感兴趣的文章
【Git入门之四】操作项目
查看>>
老男孩教育每日一题-第107天-简述你对***的理解,常见的有哪几种?
查看>>
Python学习--time
查看>>
在OSCHINA上的第一篇博文,以后好好学习吧
查看>>
高利率时代的结局,任重道远,前途叵测
查看>>
Debian 6.05安装后乱码
查看>>
欢迎大家观看本人录制的51CTO精彩视频课程!
查看>>
IntelliJ IDEA中设置忽略@param注释中的参数与方法中的参数列表不一致的检查
查看>>
关于软件开发的一些感悟
查看>>
uva 10806
查看>>
纯CSS3绘制的黑色图标按钮组合
查看>>
Linux中环境变量文件及配置
查看>>
从0开始学Flutter
查看>>
mysql操作入门基础之对数据库和表的增删改查
查看>>
IIS负载均衡
查看>>
分布式事务,EventBus 解决方案:CAP【中文文档】
查看>>
Linux下的CPU性能瓶颈分析案例
查看>>
spring mvc入门
查看>>
2012在数据库技术会议上的讲话PPT打包
查看>>
【Android】 TextView设置个别字体样式
查看>>