搜索: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 ...
随机推荐
- 1.安装CDH5.12.x
安装方式安装前准备安装步骤安装过程修改/etc/hosts设置ssh 互信修改linux 系统设置安装JDK1.8安装python2.7安装mysql/postgreysql数据库安装ntp设置本地y ...
- Linux下安装paramiko
paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台, ...
- PHP 签到,与时间获取,数组长度获取
本文实例讲述了php实现签到功能的方法.分享给大家供大家参考,具体如下:首先我在数据库里建了两张表,一个是用户的积分表,一个是签到状态表,分来用来记录用户的积分数和先到状态 在用户签到状态表中我们有一 ...
- LintCode-376.二叉树的路径和
二叉树的路径和 给定一个二叉树,找出所有路径中各节点相加总和等于给定 目标值 的路径. 一个有效的路径,指的是从根节点到叶节点的路径. 样例 给定一个二叉树,和 目标值 = 5: 返回: [ ...
- OSG学习:移动/缩放/旋转模型
移动和缩放以及旋转都是对矩阵进行操作,这些操作如果要叠加直接矩阵相乘就可以了. 下面的示例代码中,加入了四个bignathan,一个是默认加入在最中间,一个向上移2单位,一个是向下移2单位且缩放0.5 ...
- 判断集合不为空Java
list.size>0判断集合size是否大于0 list.isEmpty()判断集合是否为空,返回布尔值
- matlab中nargin函数的用法
nargin是用来判断输入变量个数的函数,这样就可以针对不同的情况执行不同的功能. 通常可以用他来设定一些默认值,如下面的函数. 例子,函数test1的功能是输出a和b的和.如果只输入一个变量,则认为 ...
- Java中的缓冲流详解
缓冲流增强了读写文件的能力,比如Student.txt是一个学生的名单,每个姓名占一行.如果我们想要读取名字,那么每次必须读取一行,使用FileReader流很难完成这样的任务,因为我们不清楚一行有多 ...
- Go语言【第一篇】:Go初识
Go语言特色 简洁.快速.安全 并行.有趣.开源 内存管理.数据安全.编译迅速 Go语言用途 Go语言被设计成一门应用于搭载Web服务器,存储集群或类似用途的巨型中央服务器的系统编程语言.对于高性能分 ...
- [BZOJ2055] 80人环游世世界
Description 想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么 一个80人的团伙,也想来一次环游世界. 他们 ...