宽度搜索(BFS)中求最短路径问题理解记录
借助ACM1242题深入理解迷宫类最短路径搜索并记录路径长度的问题及解决方法;
这是初次接触优先队列,尤其是不知道该怎样去记忆在结构体重自定义大小比较的符号方向,很容易混淆符号向哪是从大到小排列,向哪是从小到大排列;
这非常向sort和qsort排序。
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=;
char map[N][N];
int vis[N][N];
struct Node
{
int x,y,step;
friend bool operator<(Node v,Node u)
{
return v.step>u.step;//怎么记啊
}
}XX;
int n,m;
int direction[][]={{,},{-,},{,},{,-}};
bool Check(int x,int y)
{
if(x<||y<||x>=n||y>=m||map[x][y]=='#'||!vis[x][y])
return false;
return true;
}
int dfs(Node S,Node E)
{
priority_queue<Node>Q;
S.step=;
Q.push(S);
Node temp;
vis[S.x][S.y]=;
while(!Q.empty())
{
Node mid;
mid=Q.top();
Q.pop();
if(mid.x==E.x&&mid.y==E.y)return mid.step;
for(int i=;i<;i++)
{
Node next=mid;
next.x=mid.x+direction[i][];
next.y=mid.y+direction[i][];
if(Check(next.x,next.y))
{
next.step++;
if(map[next.x][next.y]=='x')
next.step++;
if(vis[next.x][next.y]>next.step)//其实这步可以抛弃,只是增大下面优先队列的处理数据量
{
vis[next.x][next.y]=next.step;//其实也可以没有这一步
Q.push(next); }
}
}
}
return -;//返回它时说明无法到达目的地
}
int main()
{
while(cin>>n>>m)
{
memset(vis,,sizeof(vis));//这里用的memset将vis赋特别大的值 ;
//memset一般用于赋值是-1和零,也用于char型符号赋值,但是当赋值为其他int型整数时,
//所得到的结果并不是你所写上的数,就像上面写的1,其实结果是很大的数,可以输出试验下;
Node s;//起点位置
Node e;//终点位置
for(int i=;i<n;i++)
{
cin>>map[i];
for(int j=;j<m;j++)
if(map[i][j]=='a')
{
e.x=i;e.y=j;
}
else if(map[i][j]=='r')
{
s.x=i;
s.y=j;
}
else if(map[i][j]=='x')//是保存那个特出守卫的坐标的
{
XX.x=i;XX.y=j;
}
}
int time=dfs(s,e);
if(time==-)cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
else cout<<time<<endl;
}
}
做这个题目话费了我好长好长时间,现在也不是太懂,不过还好啦,最起码理解这种方法了;算是长能力了。哈哈哈!
宽度搜索(BFS)中求最短路径问题理解记录的更多相关文章
- 【算法入门】广度/宽度优先搜索(BFS)
广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较 ...
- BFS - 求最短路径
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. ...
- 通俗易懂理解——dijkstra算法求最短路径
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止 ###基本思想 通过Dij ...
- 理解Lucene索引与搜索过程中的核心类
理解索引过程中的核心类 执行简单索引的时候需要用的类有: IndexWriter.Directory.Analyzer.Document.Field 1.IndexWriter IndexWr ...
- UVa 1599 理想路径(反向BFS 求最短路径 )
题意: 给定一个有重边有自环的无向图,n个点(2 <= n <= 100000), m条边(1 <= m <= 200000), 每条边有一个权值, 求从第一个点到n的最少步数 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- 广度优先搜索 BFS 学习笔记
广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...
随机推荐
- Open MPI集群运行
部署完之后,代码也能正确跑起来了,也确实集群分散了.跑一下各种各样的代码,发现了一个错误: $ ~/OpenMpi/bin/mpiexec -np ~/NetWorkTest My rank is M ...
- ptrdiff_t类型
一.特性 1. 这是一种标准库类型 2. 是两个指针相减的结果的类型(因为差值可能为负值,所以是一种带符号类型) 3. 和size_t一样,ptrdiff_t也是一种定义在<cstddef> ...
- Daily Scrum 10
今天我们小组开会内容分为以下部分: part 1: 经过反复思考,对于上次组会确定的在系统中加入娱乐版块进行了更进一步的商讨; part 2:继续探讨算法实现: part 3:进行明日的任务分配; ◆ ...
- 无法启动mysql服务 错误1067:进程意外中止
这个错误在前些周遇到过,没有解决,直接粗暴的卸载重装了,自己用的是wampserver集成环境,重装的后果是mysql里面的一些已有的数据库就没有了,有点小悲剧,不过幸好都是一些测试用的数据库,后面直 ...
- c# CLR无法从 COM 上下文 0x51cd20 转换为 COM 上下文 0x51ce90
调试菜单--->异常---->managed debugging assistants栏下ContextSwitchDeadlock 前面的√去掉
- 第二次作业 编程题 PAT 1001A+B Format
Github的object-oriented仓库:1001.A+BFormat(20) 1.解题的思路过程 在之前学习C语言时曾经碰到过类似的将数字转换成字符输出的情况,这道题目要求输出的数字每三个间 ...
- xpath教程二 ---- 通过ID和Class检索
必备知识点 在html中,id是唯一的 在html中,class是可以多处引用的 工具 Python3版本 lxml库[优点是解析快] HTML代码块[从网络中获取或者自己杜撰一个] requests ...
- [转]Windows 7 蓝屏后获取 MEMORY.DMP 文件及注意事项
转自:http://hi.baidu.com/guicomeon/item/d6753a177fc76f0f8fbde46a 系统默认会在 C:\Windows 目录下创建 MEMORY.DMP 文件 ...
- vue-cli2使用cdn方式引入cytoscape
1. index.html头部引用 <script src="https://cdnjs.cloudflare.com/ajax/libs/cytoscape/3.2.19/cytos ...
- java 基础 --int 和Integer的区别
感到脸红:int是整形 -128~127 Integer是正整型,你怎么会想到这样的回答,妈的,有脑子吗?!!! 1,int是基本数据类型,初始为0,Integer为封装类,初始为null ①无论如何 ...