搜索:BFS
2024-08-27 18:20:32
如果题目真的要考察宽度优先搜索,那么这类题目往往具有比较大的编码难度,换个说法,就是细枝末节特别多,状态特别复杂。。
剥茧抽丝,这里以一个比较“裸”的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 ;
}
最新文章
- final发布视频
- Kafka集群配置说明
- CSS 知识汇总
- UIView的响应链
- 关于远程连接MySQL数据库的问题解决
- 【Python】入门 list有些不懂
- Zabbix探索:Zabbix API使用时的错误1
- 商务通简单弹窗样式 V1.0
- 手写js面向对象选项卡插件
- linux常用脚本
- C++ STL中的map用红黑树实现,搜索效率是O(lgN),为什么不像python一样用散列表从而获得常数级搜索效率呢?
- BZOJ2434: [Noi2011]阿狸的打字机(AC自动机 树状数组)
- linux安装方式
- 机器学习 第四篇:OLS回归分析
- Linux查看用户属于哪些组/查看用户组下有哪些用户
- python粘包分析与解决
- Where To Buy -- proposed by Renqian Luo
- BZOJ4042 : [Cerc2014] parades
- 【RS】CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Collaborative Filtering-CoupledCF:在推荐系统深度协作过滤中学习显式和隐式的用户物品耦合
- python3 functools partial 用于函数的包装器详解