广度优先搜索(bfs),是一种较为常用的搜索算法,可以以某个位置,对其出现的多个结果的子结果及其后的结果进行大范围我搜索。该算法与深搜的本质上不同,广搜的本质是对某一具体结果的搜索,例如求地图上某点到目标点的最短路程,其作用也常用于求最短路程或最少次数,深搜则能体现出一个结果搜索出的整个过程,一定要把深搜和广搜区别开。
广搜常用队列,如queue队列,通过front将初始值放入队列顶部,在进行搜索得出其所有可能出现的结果后,初始值失去价值,踢出队列,得出的结果也进行如上操作,直至寻找到目标值。
题目:数轴上有一个点位于坐标kk处(0 ≤ k ≤ 100,000)(0≤k≤100,000) ,你从位置n(0≤n≤100,000)n(0≤n≤100,000)处开始往k处以以下两种方式走:
1.花费一分钟从位置xx移动到位置x+1x+1或者x-1x−1
2.花费一分钟从位置xx移动到2×x2×x
求:最少花费几分钟可以从数轴n处走到位置k处;
输入:输入只有一行,包括:两个用空格分隔的整数n和k;
输出:输出只有一行:打印最短时间(单位为分钟);
思路:由题可知本题目的是求最短时间,并且题目中出现多种结果,很容易想出要使用bfs来求题。题目本身很简单,只需要简单的使用bfs即可AC,要注意一个点 s可能大于e 此时只需要输出s-e即可;
下边附上代码:
#include<bits/stdc++.h>
using namespace std;
queue<int>q;
int s,e;
int book[101010];
int step[101010];
int bfs(int s,int e)
{
int head,next;
q.push(s);
step[s]=0;
book[s]=1;
while(!q.empty())
{
head=q.front();
q.pop();
for(int i=0;i<3;i++)
{
if(i==0)
{
next=head+1;
}
else if(i==1)
{
next=head-1;
}
else if(i==2)
{
next=head*2;
}
if(next<0||next>100000)
continue;
if(!book[next])
{
q.push(next);
step[next]=step[head]+1;
book[next]=1;
}
if(next==e)
return step[next];
}
}
}
int main()
{
scanf("%d %d",&s,&e);
if(s>=e)
printf("%d",s-e);
else
printf("%d",bfs(s,e));
}