【算法练习】搜索 百炼 poj 4001:抓住那头牛

题目链接:http://bailian.openjudge.cn/practice/4001

4001:抓住那头牛

总时间限制: 

2000ms

 

内存限制: 

65536kB

描述

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:

1、从X移动到X-1或X+1,每次移动花费一分钟

2、从X移动到2*X,每次移动花费一分钟

 

假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?

 

输入

两个整数,N和K

输出

一个整数,农夫抓到牛所要花费的最小分钟数

样例输入

5 17

样例输出

4

理解题意:搜索的题目,本来想模拟可以解决,是我想多了。求最优解可以用BFS。

其实就是最短路~

-1的时候就是限制一下减的范围~  >=0 ,其他两种情况

“因为农夫每次移动的代价都是一样的,而广度优先搜索算法在权值一样时的解即为最佳解,所以此题用广度优先搜索算法就可以解决了。我们可以把农夫的所有状态看成一个三叉树,农夫的初始点为树的根节点,然后依次访问当前节点的三个孩子(+1,-1,*2),每访问一个节点时将该节点放入队列以实现广度优先搜索。最佳解出现时跳出循环,(因为此题必有解所以不同担心广度搜索不收敛的问题)。”
--------------------- 
原文:https://blog.csdn.net/king_way/article/details/33305017 
 

#include 
#include 
#include 
#include 
using namespace std;
const int maxn=100010;
#define INF 0x3f3f3f
int n,k,ct,res;
int visit[maxn];
struct Node{
    int x,step;
    Node() {}
    Node(int xx,int ss):x(xx),step(ss){}
};
queue Q;

void BFS(){
    while(!Q.empty()){
        Node cur=Q.front();
        Q.pop();
        int x=cur.x;
        int step=cur.step;
        if(x==k){
            res=step;
            return;
        }

        int xx;
        xx=x+1;
        if(xx=0  && !visit[xx]){   //这个是大于等于0的条件
            visit[xx]=1;
            Q.push(Node(xx,step+1));
        }

        xx=x*2;
        if(xx>n>>k;
    res=INF;
    memset(visit,0,sizeof(visit));
    visit[n]=1;
    Q.push(Node(n,0));
    BFS();
    cout<

 

你可能感兴趣的:(算法练习)