宽度搜索(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 $ 有一条路 ...
随机推荐
- POJ 2184 Cow Exhabition
"Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - Cows with G ...
- 使用清华镜像在python中pip 安装
Anaconda的安装步骤不在本文的讨论中,我们主要是学习一下如何配置conda的镜像,以及一些问题的解决过程 配置镜像 在conda安装好之后,默认的镜像是官方的,由于官网的镜像在境外,我们使用国内 ...
- The Activation Function in Deep Learning 浅谈深度学习中的激活函数
原文地址:http://www.cnblogs.com/rgvb178/p/6055213.html 版权声明:本文为博主原创文章,未经博主允许不得转载. 激活函数的作用 首先,激活函数不是真的要去激 ...
- 条款02:尽量以const,enum,inline替换#define
一.概述 尽量少用预处理器——宏替换 二.细节 1. 关于宏替换之常量 旧版本:#define N 10; 新版本:const int n = 10; 比较:#define不被视为语言的一部分,记号名 ...
- Java学习个人备忘录之多态
对象的多态性 class 动物 {} class 猫 extends 动物 {} class 狗 extends 动物 {} 猫 x = new 猫();//意思是建立本类的对象 new 猫(),并通 ...
- Notes of the scrum meeting(12.9)
meeting time:14:00~17:00p.m.,December 9th,2013 meeting place:一号教学楼209 attendees: 顾育豪 ...
- 加密和数字签名工具GPG
转载: 源文件位置:http://blog.chinaunix.net/uid-9525959-id-2001824.html GPG [功能] GPG是加密和数字签名的免费工具,大多用于加密信息的 ...
- /var/redis/run/redis_6379.pid exists, process is already running or crashed的解决办法
命令:service redis start /var/redis/run/redis_6379.pid exists, process is already running or crashed 引 ...
- byte字节的输入流 建议使用字节数组形式接受内容 因为当输入流是汉字时候 会超出字节的范围 出现无法读取的现象
byte字节的输入流 建议使用字节数组形式接受内容 因为当输入流是汉字时候 会超出字节的范围 出现无法读取的现象
- BZOJ 1025 游戏(分组背包)
题目所谓的序列长度实际上就是各循环节的lcm+1. 所以题目等价于求出 一串数之和等于n,这串数的lcm种数. 由唯一分解定理可以联想到只要把每个素数的幂次放在一个分组里,然后对整体做一遍分组背包就行 ...