BFS算法入门--POJ3984
迷宫问题–POJ3984
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 22008 Accepted: 12848
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 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
CE–4次,PE–2次.
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<string>
#define N 5 //迷宫长度
#define M 5 //迷宫宽度
using namespace std;
int maze[N][M];
typedef struct point
{
int x;
int y;
point *previous;
int step;
}point;
int sx = 0, sy = 0; //起点
int gx = 4, gy = 4; //终点
int dir[4][2] = { //方向
{0,1},{1,0}, //上,右
{0,-1},{-1,0} //下,左
};
void show(point *p) //逆向输出链表
{
if (p != NULL)
{
show(p->previous);
cout << "(" << p->x << ", " << p->y << ")" << endl;
}
}
void BFS(point start)
{
queue<point> q;
q.push(start); //把头节点放入队列
point current,next;
while (!q.empty())
{
current = q.front(); // 记录当前节点
q.pop(); //弹出元素
maze[current.x][current.y] =1;
for (int i = 0; i < 4; i++)
{
/*此处本来可以使用next{ current.x + dir[i][0],current.y + dir[i][1],NULL,0 };这样的写法,但是poj不认,所以退而求其次,用下面这种写法*/
next.x=current.x + dir[i][0];
next.y=current.y + dir[i][1];
next.previous=NULL;
next.step=0 ;
if (next.x >= 0 && next.x < N&&next.y >= 0 && next.y < M&&maze[next.x][next.y] ==0) //判断这个点是否合乎要求,即在迷宫数组内,但是又不是墙,并且没有被标记过
{
point *tmp = new point; //申请空间
memcpy(tmp, ¤t, sizeof(point)); //复制地址
next.previous = tmp;
//next.step = current.step + 1; //如果需要记录路径的话,就加上这一句
maze[next.x][next.y] = 1; //表示这个点已经被搜索过了,所以标记
if (next.x == gx &&next.y==gy)//如果发现到了终点,那么就输出路径
{
show(&next);
return;
}
q.push(next); //将下一个点加入队列
}
}
}
}
int main(void)
{
for (int i = 0; i <= 4; ++i)
for (int j = 0; j <= 4; ++j)
cin >> maze[i][j];
point start;
start.x=0;
start.y=0,start.previous=NULL;
start.step=0;
BFS(start);
return 0;
}
这里主要是记录路径比较麻烦,如果不考虑这个,就是一道简单的BFS题,对于BFS,需要将题目抽象成一副图,包含对应的节点和对应的边,在这里,节点就是迷宫的每个点,如果两个点之间是联通的话,那么可以认为两个节点之间建立了一条边,而对于迷宫而言,就是一个无权图,或者说是个权重为1的有权图,通过广搜就可以获得起路径,而BFS是否一定会获得最短路径,这个是一定的。
http://blog.csdn.net/raphealguo/article/details/7523411
这个作者讲的很清楚,我也是从中得到启发。
BFS算法入门--POJ3984的更多相关文章
- 【算法入门】广度/宽度优先搜索(BFS)
广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较 ...
- 广度优先搜索 BFS算法
广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...
- Day1 BFS算法的学习和训练
因为自己的原因,之前没有坚持做算法的相应学习,总是觉得太难就半途而废,真的算是一个遗憾了,所以现在开始,定一个30天入门学习算法计划. 我是根据<算法图解>的顺序进行安排的,自己对 ...
- 【算法入门】深度优先搜索(DFS)
深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解 ...
- A*算法入门
来源:http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算法. 启发式搜索 ...
- 【转】 SVM算法入门
课程文本分类project SVM算法入门 转自:http://www.blogjava.net/zhenandaci/category/31868.html (一)SVM的简介 支持向量机(Supp ...
- 【ToolGood.Words】之【StringSearch】字符串搜索——基于BFS算法
字符串搜索中,BFS算法很巧妙,个人认为BFS算法效率是最高的. [StringSearch]就是根据BFS算法并优化. 使用方法: string s = "中国|国人|zg人|fuck|a ...
- 三角函数计算,Cordic 算法入门
[-] 三角函数计算Cordic 算法入门 从二分查找法说起 减少乘法运算 消除乘法运算 三角函数计算,Cordic 算法入门 三角函数的计算是个复杂的主题,有计算机之前,人们通常通过查找三角函数表来 ...
- 循环冗余校验(CRC)算法入门引导
目录 写给嵌入式程序员的循环冗余校验CRC算法入门引导 前言 从奇偶校验说起 累加和校验 初识 CRC 算法 CRC算法的编程实现 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌 ...
随机推荐
- 创建weblogic domain
做成了PDF文档 这里可下载可以看 config.sh 命令目录 weblogic/Oracle/Middleware/wlserver_10.3/common/bin├── commEnv.sh├─ ...
- No module named Crypto--转
https://blog.csdn.net/lacoucou/article/details/53152122 背景:win10+python 2.7 在python 中使用AES算法时,会报告上述错 ...
- php 入门
<?php $username = $_POST["username"]; $passcode = $_POST["passcode"]; # 一定要my ...
- 解决navicate 连接mysql数据库中文乱码的问题
以下均是ubuntu12.04为准 1.修改mysql的配置文件. 1.1.vi /etc/mysql/my.conf找到[client]在其下面添加 default-character-set=u ...
- jq回到顶部效果分析
在浏览网页时,超出屏幕高度就会出现提上点击回到顶部的图标,点击即可回到页面顶部. 用到的知识点如下: 1.首先控制图标的显示和隐藏,先要获取浏览器的高度. var wHeight = $(window ...
- 了解委托(Delegate)
委托是一种全新面向对象语言特性,运行在.Net平台 基于委托,开发事件驱动程序变得非常简单 使用委托可以大大简化多线程变成的难度 理解委托 int a: //定义变量 a=100://给变量赋值 ...
- 文件监控只FileSystemWatcher控件
FileSYstemWatcher控件是用来监控一个文件系统或监控文件变化.该控件会通知文件创建.修改.删除的消息,分别通过Created事件.Changed事件和Deleted事件来处理对应的操作 ...
- python的数字
1.整数 与其它语言不同点两个乘号(**)代表 乘方运算 .前面代表底数,后面代表指数. 2.浮点数 它的小数位数可能是不确定的,需要注意 3.使用str()避免错误 在输出字符串时,可以避免类型错误 ...
- Python模块入门(一)
一.模块介绍 模块就是一系列功能的集合体 模块有三种来源: 1.内置模块:python内提供的模块 2.第三方模块:由第三方提供的模块 3.自定义模块:自行定义的模块 模块的格式: 1.使用pytho ...
- BZOJ4709: [Jsoi2011]柠檬(决策单调性)
题意 题目链接 Sol 结论:每次选择的区间一定满足首位元素相同.. 仔细想想其实挺显然的,如果不相同可以删掉多着的元素,对答案的贡献是相同的 那么设\(f[i]\)表示到第\(i\)个位置的最大价值 ...