深搜BFS

在学习搜索时写出来的第一道题,其中不会计算追赶时所走的步数,最后看了非常好的代码才明白。

农夫约翰已经被告知一头逃逸的奶牛的位置,并希望立即抓住她。他从数字行上的点 N (0 ≤ N ≤ 100,000) 开始,而牛在同一数字行上从点 K (0 ≤ K ≤ 100,000) 开始。农民约翰有两种交通方式:步行和传送。

步行:约翰 可以在一分钟内从任何点 X移动到点X - 1 或
X + 1 ,传送:约翰 可以在一分钟内从任何点 X移动到点 2 × X。

如果牛不知道约翰的追赶,不移动,多久农民约翰要找回它?

#include <iostream>
#include <queue>
#include<cstring>
using namespace std;
int arr[200000]={
    
    0};//定义大点的数组防止超限
void bfs(int a,int b)
{
    
    
    if(a==b)
    {
    
    
        cout<<0<<endl;//位置相同时为0
    }
    else {
    
    queue<int>s;
    s.push(a);
    arr[a]++;//区分已经放入队列的
    int i,k,x[3],m[200000]={
    
    0},n;//计算步数
    while(!s.empty())
    {
    
    
        k=s.front();
        s.pop();
        if(k<b)
        {
    
    
            x[0]=k+1;//三种情况
            x[1]=k-1;
            x[2]=k*2;
        }
        else if(k>b)
        {
    
    
            for(i=0;i<3;i++)
            {
    
    
                x[i]=k-1;
            }
        }
        for(i=0;i<3;i++)
        {
    
    
            if(x[i]==b)
            {
    
    
                n=k;
                while(!s.empty())//清空队列
                {
    
    
                    s.pop();
                }
                break;
            }
            else if((x[i]>b||x[i]<b)&&arr[x[i]]==0)
            {
    
    
                s.push(x[i]);
                m[x[i]]=m[k]+1;//计算步数
                arr[x[i]]++;//区分并放入队列
            }
        }
    }
    cout<<m[n]+1<<endl;}
}
int main()
{
    
    
    int a,b;
    cin>>a>>b;
    bfs(a,b);
}

猜你喜欢

转载自blog.csdn.net/weixin_51996479/article/details/113350194