1253:抓住那头牛

题目来源:http://ybt.ssoier.cn:8088/problem_show.php?pid=1253

1253:抓住那头牛


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 4111     通过数: 1587 

【题目描述】

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

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

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

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

【输入】

两个整数,N和K。

【输出】

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

【输入样例】

5 17

【输出样例】

4

解析:
本题并不难,属于简单的BFS,需要主要注意的是本题需要计步。

参考代码:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define N 100010
using namespace std;
int dir[]={-1,1};
bool s[N*10]={0};//曾经到达过的点无需重复计算 
struct node{
    int x,step;
}q[N*10];
void bfs(int n,int k)
{
    int head=0,tail=1;
    q[tail].step=0;q[tail].x=n;
    s[n]=1;
    do
    {
        head++;
        int step=q[head].step;//计步器 
        int x=q[head].x;
        
        if(x==k)//判断是否到达 
        {
            printf("%d",step);
            return;
        }
        
        int nx;
        nx=x*2;
        if(nx>=0&&!s[nx]&&nx<N)
        {
            tail++;
            s[nx]=1;
            q[tail].step=step+1;
            q[tail].x=nx;
        }
        for(int i=0;i<2;i++)
        {
            nx=x+dir[i];
            if(0<=nx&&!s[nx]&&nx<N) 
            {
                tail++;
                s[nx]=1;
                q[tail].step=step+1;
                q[tail].x=nx;
            }
        }
    }while(head<tail);
}
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    bfs(n,k);
    return 0;
}

2019-04-21 12:11:20

 
原文地址:https://www.cnblogs.com/DarkValkyrie/p/10744638.html