迷宫问题–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, &current, 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的更多相关文章

  1. 【算法入门】广度/宽度优先搜索(BFS)

    广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较 ...

  2. 广度优先搜索 BFS算法

    广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...

  3. Day1 BFS算法的学习和训练

    ​ 因为自己的原因,之前没有坚持做算法的相应学习,总是觉得太难就半途而废,真的算是一个遗憾了,所以现在开始,定一个30天入门学习算法计划. ​ 我是根据<算法图解>的顺序进行安排的,自己对 ...

  4. 【算法入门】深度优先搜索(DFS)

    深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解 ...

  5. A*算法入门

    来源:http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算法. 启发式搜索 ...

  6. 【转】 SVM算法入门

    课程文本分类project SVM算法入门 转自:http://www.blogjava.net/zhenandaci/category/31868.html (一)SVM的简介 支持向量机(Supp ...

  7. 【ToolGood.Words】之【StringSearch】字符串搜索——基于BFS算法

    字符串搜索中,BFS算法很巧妙,个人认为BFS算法效率是最高的. [StringSearch]就是根据BFS算法并优化. 使用方法: string s = "中国|国人|zg人|fuck|a ...

  8. 三角函数计算,Cordic 算法入门

    [-] 三角函数计算Cordic 算法入门 从二分查找法说起 减少乘法运算 消除乘法运算 三角函数计算,Cordic 算法入门 三角函数的计算是个复杂的主题,有计算机之前,人们通常通过查找三角函数表来 ...

  9. 循环冗余校验(CRC)算法入门引导

    目录 写给嵌入式程序员的循环冗余校验CRC算法入门引导 前言 从奇偶校验说起 累加和校验 初识 CRC 算法 CRC算法的编程实现 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌 ...

随机推荐

  1. nginx虚拟主机配置和反向代理

    虚拟主机有三种配置方式(常用于本机测试使用,将一个ip和端口的请求根据域名不同分配到不同的应用服务器) 基于ip 不常用 基于端口 可选 基于域名 可选 #user nobody; worker_pr ...

  2. mysql中操作符LIKE与通配符%的使用

    mysql中通配符%用来通配其他字符,操作符LIKE用来查询字段中存在相同的字符 SELECT t.userId,t.cellphone,t.idNo,t.* FROM t_person t WHER ...

  3. WebGL 踩坑系列-1

    WebGL 中的一些选项WebGL 中开启颜色混合(透明效果) gl.enable(gl.BLEND); gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALP ...

  4. .NET面试题2

    常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还是值类型?enum.int[]和string呢? 4. 堆和栈的区别? 5. 什么情况下会在堆 ...

  5. NLog学习笔记二:深入学习

    配置文件 NLog所有的配置信息都可以写到一个单独的xml文件中,也可以在程序代码中进行配置. 配置文件位置 启动的时候,NLog会试图查找配置文件完成自动配置,查找的文件依次如下(找到配置信息则结束 ...

  6. ASP .NET 404 Not Found fontawesome-webfont.woff?v=4.0.3

    解决Web部署 svg/woff/woff2字体 404错误最近项目中用到了fontawesome-webfont.svg等字体.部署项目后,发现没有<,+等符号,字体也不对,发现浏览器总是报找 ...

  7. C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序

    本教程适用于Windows系统 从浏览器上打开本地程序,主要用到了本地URL协议,其实主要就是改注册表 先建立一个项目,我建的是控制台项目 在Program.cs写2个静态方法用来添加注册表.移除注册 ...

  8. C#入门--索引器

    C#入门--索引器 索引器允许类或结构的实例按照与数组相同的方式进行索引.索引器类似于属性,不同之处在于它们的访问器采用参数. 索引器概述 索引器使得对象可按照与数组相似的方法进行索引. get 访问 ...

  9. 修复kindEditor点击加粗, 内容焦点跳动的问题

    大概1560~1569行 pos : function() { var self = this, node = self[0], x = 0, y = 0; if (node) { if (node. ...

  10. dos命令执行mysql的sql文件

    1.cmd进入dos窗口 2.输入cd+ mysql的bin目录后进入bin文件下 3.进入控制台:mysql -uroot -proot  回车 4.选择数据库:use mydata go 回车 5 ...