POJ 3984 迷宫问题
2016-07-30 10:41
253 查看
迷宫问题
定义一个二维数组: 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把路径查出来,然后用一个数组记录,最后用并查集把这些点连起来。感觉非常神奇。
也是一道难度比较低的题,至少除了算法以外不需要思考太多东西。很适合了解bfs。
#include<stdio.h> #include<string.h> int map[5][5],vis[5][5]; int per[100]; struct node { int x,y; }a[111]; int dis[4][2]={{-1,0},{1,0},{0,1},{0,-1}}; int OK(int x,int y) { if(x>=0&&y>=0&&x<5&&y<5&&map[x][y]==0) return 1; return 0; } void print(int x)//从一直查到树的根部!! { int t; t=per[x]; if(t==0) { printf("(0, 0)\n"); printf("(%d, %d)\n",a[x].x,a[x].y); return; } else print(t); printf("(%d, %d)\n",a[x].x,a[x].y);//好像用到了递归回溯,一旦t==0成立,前面所有都回溯了。 } void bfs() { int i,head,tail; int x,y,tx,ty; memset(vis,0,sizeof(vis)); head=0;tail=1; a[0].x=0;a[0].y=0; per[0]=-1; while(head<tail) { x=a[head].x; y=a[head].y; if(x==4&&y==4) { print(head); return; } for(i=0;i<4;i++) { tx=x+dis[i][0]; ty=y+dis[i][1]; if(!vis[tx][ty]&&OK(tx,ty)) { vis[tx][ty]=1; a[tail].x=tx; a[tail].y=ty; per[tail]=head; tail++; } } head++; } return; } int main() { int i,j; for(i=0;i<5;i++) for(j=0;j<5;j++) scanf("%d",&map[i][j]); bfs(); return 0; }
大概几分钟后……
我灵光一闪明白我写的print()函数怎么回事啦!!!!(……喂
应该还是回溯!就跟dfs回溯的原理一样!
相关文章推荐
- 有三个整数,获取最大值,通过三元运算符完成。
- Activity——生命周期
- 纷菲幻剑录 之 十年一剑
- poj 1094 topo 在线处理数据
- 表空间的管理
- Hello World, Perl
- cocos引用iconv库在android编译,错误undefined reference libiconv_open,libiconv_close
- CSS 选择器、jQuery选择器大全
- 实习点滴 - 跟一个蠢bug学习多线程调试、线程安全和可重入函数
- 对两个整数变量的值进行互换(不需要第三方变量)
- PyQt5教程-04-关闭窗口
- 权限管理——权限模型和权限控制
- js 字符串转换成int或者float类型
- 详解 CSS 属性 - 伪类和伪元素的区别
- int和short int 区别
- 详解js中的apply与call的用法
- C++中输出入门级格式:前补0以及精确度
- Python操作memcached及redis
- 用jquery怎么删除<table>的一行
- scala学习手记28 - Execute Around模式