BFS(广度优先搜索)---抓住那头牛

本文详细解析了使用C++实现的宽度优先搜索(BFS)算法,通过寻找从起点到终点的最短路径来演示队列(queue)的使用,介绍了queue的基本函数及struct的简单应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

在这里插入图片描述

样例输入

1 89

样例输出

9

代码:

#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <string>
#include <queue>
#include <stack>
#include <map>  
#include <set>

#define _for(i,a,b) for(int i=a;i<b;i++)
#define _unfor(i,a,b) for(int i=a;i>=b;i--)
#define RI(a) scanf("%d",&a)
#define mset(a,val,n) for(int i=0;i<n;i++)a[i]=val;
#define mset2(a,val,n,m) for(int i=0;i<n;i++)for(int j=0;j<m;j++)a[i][j]=val;
#define FI freopen("D:\\in.txt","r",stdin)
#define FO freopen("D:\\out.txt","w",stdout)

using namespace std;
typedef long long LL;
/*-------下面为主要代码-------*/

int N,K;
const int MAXN = 100000;
int visited[MAXN+10]; //判重标记,visited[i] = true 表示 i已经扩展过
struct Step //设置 Step 用于存储信息
{
	int x; //当前位置
	int steps; //到达 x 所需的步数
	Step(int xx,int s):x(xx),steps(s) {} //
};
queue<Step> q; //队列 q
int main()
{
	cin >> N >> K;
	memset(visited,0,sizeof(visited));
	q.push(Step(N,0)); //将 Step 加入队列(尾)中
	visited[N] = 1;
	while(!q.empty()) //记住用这种方式
	{
		Step s = q.front();
		if( s.x == K )
		{ //找到目标
			cout << s.steps <<endl;
			return 0;
		}
		else
		{
			if( s.x - 1 >= 0 && !visited[s.x-1] )
			{
				q.push(Step(s.x-1,s.steps+1));
				visited[s.x-1] = 1;
			}
			if( s.x + 1 <= MAXN && !visited[s.x+1] )
			{
				q.push(Step(s.x+1,s.steps+1));
				visited[s.x+1] = 1;
			}
			if( s.x * 2 <= MAXN &&!visited[s.x*2] )
			{
				q.push(Step(s.x*2,s.steps+1));
				visited[s.x*2] = 1;
			}
			q.pop(); //前面加一个 Step 后面就删除一个 Step
		}
	}
	return 0;
}

解析:

1、关于 queue 的基本函数

queue功能
size()返回队列中的元素个数
front()返回队头的元素
back()返回队尾元素
pop()删除队头的元素
push(g向队尾中添加元素 g
empty()在队列没有元素时返回 true
其用法与 vector 类似,可参考 C++ STL库 容器与方法 中的 Vector 容器
2、由于在 C++ 中 struct 和 class 最主要的区别是默认访问权限和继承方式不同,而其他方面的差异很小,所有在算法竞赛中使用较为简单的 struct
3、其实代码整体上的 queue< Step> q 中可以理解为只有两个元素(Step),一个是从一开始加入的,另一个是用于搜索的,而这个用于搜索的是根据队列的第一个 Step 改进而成的,当改完后用 q.pop()删除第一个 Step,自己就成为了第一个 Step,并继续第二轮搜索,直到找到目标
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值