搜索:BFS
如果题目真的要考察宽度优先搜索,那么这类题目往往具有比较大的编码难度,换个说法,就是细枝末节特别多,状态特别复杂。。
剥茧抽丝,这里以一个比较“裸”的BFS作为例子,了解一下实现BFS的一些规范。
直接把题目拿过来:

这道题如果看成了DP的话很容易写记忆化,但是,但是会爆栈。如果不信,你可以写一个递归实现的斐波那契数列然后输入一个比较大的数试一试。
求最少,最短,先考虑宽搜。
我们首先把宽搜涉及到的状态点定义出来,这就是我们之后将要入队出队的元素类型:
struct Queue
{
int cur,st;
}q[maxn];
bool vis[maxn];
一般来说,状态都是比较复杂的,而且,千万不要忘记判重!!
接下来我们列出几种“转移方式”,也可以说搜索树往下走的时候会有几个分叉,这道题的分叉可以定义成这样:
if(q[h].cur==k)
{
ans=q[h].st;
break;
}
if(q[h].cur+<=&&!vis[q[h].cur+])
{}
if(q[h].cur->=&&!vis[q[h].cur-])
{}
if(q[h].cur*<=&&!vis[q[h].cur*])
{}
对于结果的判断,找到结果直接退出循环就可以了,肯定是最优解。
然后就是几个搜索分支,这道题比较简单把判断直接写在了if里面,如果判断条件很复杂,建议自己实现一个check函数
t=t%maxn+;
q[t].cur=q[h].cur+;
q[t].st=q[h].st+;
vis[q[t].cur]=true;
对于每一个分支就是一个新入队的点,我们把“新”的特征表示出来之后,入队和打标记。
完整的实现如下,题目输入n和k,输出最短的移动次数。
#include<iostream>
using namespace std;
const int maxn=;
int n,k;
int ans;
struct Queue
{
int cur,st;
}q[maxn];
bool vis[maxn];
int main()
{
cin>>n>>k;
int h=,t=;
q[t].cur=n;
q[t].st=;
while(h!=t)
{
h=h%maxn+;
if(q[h].cur==k)
{
ans=q[h].st;
break;
}
if(q[h].cur+<=&&!vis[q[h].cur+])
{
t=t%maxn+;
q[t].cur=q[h].cur+;
q[t].st=q[h].st+;
vis[q[t].cur]=true;
}
if(q[h].cur->=&&!vis[q[h].cur-])
{
t=t%maxn+;
q[t].cur=q[h].cur-;
q[t].st=q[h].st+;
vis[q[t].cur]=true;
}
if(q[h].cur*<=&&!vis[q[h].cur*])
{
t=t%maxn+;
q[t].cur=q[h].cur*;
q[t].st=q[h].st+;
vis[q[t].cur]=true;
}
}
cout<<ans;
return ;
}
搜索:BFS的更多相关文章
- HDU 1312 Red and Black --- 入门搜索 BFS解法
HDU 1312 题目大意: 一个地图里面有三种元素,分别为"@",".","#",其中@为人的起始位置,"#"可以想象 ...
- 【算法入门】广度/宽度优先搜索(BFS)
广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
- 广度优先搜索 BFS算法
广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS
词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...
- 广度优先搜索 BFS 学习笔记
广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...
- 广度优先搜索(BFS)
定义 维基百科:https://en.wikipedia.org/wiki/Breadth-first_search 给定图G=(V,E)和一个可识别的源结点s,广度优先搜索对图G中的边进行系统性的探 ...
- HDU 4707 Pet(DFS(深度优先搜索)+BFS(广度优先搜索))
Pet Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...
随机推荐
- NIO初探
NIO的前世今生 NIO又叫NonBlockingI/O,即非阻塞I/O.以此对应的,有一个更常见的IO(BIO),又叫Blocking I/O,即阻塞IO,两种都为Java的IO实现方案. NIO/ ...
- JavaScript初探系列之面向对象
面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...
- java中 i = i++和 j = i++ 的区别
由于i++和i--的使用会导致值的改变,所以在处理后置的++和--的时候,java的编译器会重新为变量分配一块新的内存空间,用来存放原来的值, 而完成赋值运算之后,这块内存会被释放. (1)对于j = ...
- 3ds Max学习日记(八)
再来更新一波学习进度. 之前玩了一下3dsmax里的灯光,不过由于和教程里的版本不同,教程里的我的没有,我有的教程又没有,所以只能瞎jb玩一玩. 最近又想建个人物模型玩玩,于是上网搜一下有 ...
- python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
#vi /etc/ld.so.conf.d/python2.7.conf 加入/usr/local/python27/lib 保存退出后执行 #ldconfig
- 《Effective C#》快速笔记(五)- - C# 中的动态编程
静态类型和动态类型各有所长,静态类型能够让编译器帮你找出更多的错误,因为编译器能够在编译时进行大部分的检查工作.C# 是一种静态类型的语言,不过它加入了动态类型的语言特性,可以更高效地解决问题. 一. ...
- matlab如何将数组中的NAN值去除
比如我们一组数据,里面有不少的NaN值,如何将其删除掉呢?可以通过find函数来搞定. 我们可以通过importdata('data.txt')将数据文件data.txt导入数组A中. ...
- Delphi DBGrid双击事件、单元格操作
1.得到当前格子中的内容:DBGrid1.Fields[DBGrid1.SelectedIndex].DisplayText;把DBGrid1.SelectedIndex改为你所希望引用的字段就可以了 ...
- 【bzoj1131】[POI2008]Sta 树形dp
题目描述 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 输入 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. 输出 输出你所找到的点,如果具有 ...
- 【bzoj1617】[Usaco2008 Mar]River Crossing渡河问题 dp
题目描述 Farmer John以及他的N(1 <= N <= 2,500)头奶牛打算过一条河,但他们所有的渡河工具,仅仅是一个木筏. 由于奶牛不会划船,在整个渡河过程中,FJ必须始终在木 ...