如果题目真的要考察宽度优先搜索,那么这类题目往往具有比较大的编码难度,换个说法,就是细枝末节特别多,状态特别复杂。。

剥茧抽丝,这里以一个比较“裸”的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的更多相关文章

  1. HDU 1312 Red and Black --- 入门搜索 BFS解法

    HDU 1312 题目大意: 一个地图里面有三种元素,分别为"@",".","#",其中@为人的起始位置,"#"可以想象 ...

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

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

  3. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  4. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

  5. 广度优先搜索 BFS算法

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

  6. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  7. 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS

    词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...

  8. 广度优先搜索 BFS 学习笔记

    广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...

  9. 广度优先搜索(BFS)

    定义 维基百科:https://en.wikipedia.org/wiki/Breadth-first_search 给定图G=(V,E)和一个可识别的源结点s,广度优先搜索对图G中的边进行系统性的探 ...

  10. HDU 4707 Pet(DFS(深度优先搜索)+BFS(广度优先搜索))

    Pet Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

随机推荐

  1. javascript打开新窗口

    一.window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二.基本语法: window.open(pageURL,name, ...

  2. MongoDB3.2 集群搭建

    一.集群的理论知识 1.1 集群成员 MongoDB的集群类似于GreenPlum集群,由一个入口节点负责任务分发与结果统计,分片结节负责执行任务.不同GP,多了一个config servers. 集 ...

  3. 基础数据类型-dict

    字典Dictinary是一种无序可变容器,字典中键与值之间用“:”分隔,而与另一个键值对之间用","分隔,整个字典包含在{}内: dict1 = {key1:value1, key ...

  4. 20145214实验三 敏捷开发与XP实践

    20145214实验三 敏捷开发与XP实践 XP准则 沟通 :XP认为项目成员之间的沟通是项目成功的关键,并把沟通看作项目中间协调与合作的主要推动因素. 简单 :XP假定未来不能可靠地预测,在现在考虑 ...

  5. 总结python 元组和列表的区别

    python的基本类型中有元组和列表这么俩个,但是这哥俩却比较难于区分,今天就来用简单的实例说明两者的不同. 列表:1.使用中括号([ ])包裹,元素值和个数可变 实例: aaa = ['sitena ...

  6. jspSmartUpload上传下载使用例子

    --------------------------------------------------------------------- ServletUpload.java 上传 package ...

  7. java中对象和对象的引用

    1.何谓对象? 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一 ...

  8. Swift-元祖

    1.元组是多个值组合而成的复合值.元组中的值可以是任意类型,而且每一个元素的类型可以是不同的. let http404Error = (,"Not Found") print(ht ...

  9. java 基本--数据类型转换--001

    小可转大,大转小可能会损失精度(编译出错,需要强制转换)A: byte,short,char -> int -> long -> float ->doubleB: byte,s ...

  10. [剑指Offer] 51.构建乘积数组

    题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1].不 ...