搜索专题 G

来源:互联网 发布:网络恐怖主义的成因 编辑:程序博客网 时间:2024/05/30 04:15

1、简单描述

   人在m点,牛在k点,人去追牛,可以一次前进一步,可以一次后退一步,可以一次到达当前点数的二倍处。每走一步花费一秒,最小多长时间追到牛?

2、思路

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int M,K;
queue <int> q;
int ret[100001];
bool vis[100001];
int bfs(int m,int k)
{
    if(m==k)return 0;
    q.push(m);
    int cur;
    while(!q.empty())
    {
        cur=q.front();
        q.pop();
        if(cur+1<100001&&!vis[cur+1])
        {
            q.push(cur+1);
            ret[cur+1]=ret[cur]+1;
            vis[cur+1]=true;
        }
        if(cur+1==k)break;
        if(cur-1>=0&&!vis[cur-1])
        {
            q.push(cur-1);
            ret[cur-1]=ret[cur]+1;
            vis[cur-1]=true;
        }
        if(cur-1==k)break;
        if(cur*2<100001&&!vis[cur*2])
        {
            q.push(cur*2);
            ret[cur*2]=ret[cur]+1;
            vis[cur*2]=true;
        }
        if(cur*2==k) break;
    }
    return ret[k];
}
int main()
{
    cin>>M>>K;
    cout<<bfs(M,K)<<endl;
    return 0;
}

bfs,从当前点开始搜索,到达可从该点到达的点,再将这些点放入队列,再进行搜索。判断节点是否为终点,标记该点是否访问过。

0 0
原创粉丝点击