POJ - 3278 Catch That Cow (BFS)(day_1)

版权声明:商业转载请联系作者获得授权,非商业转载请注明出处。 https://blog.csdn.net/weixin_43939327/article/details/86606461

Catch That Cow

Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 128113 Accepted: 39832
Description

Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.

  • Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
  • Teleporting: FJ can move from any point X to the point 2 × X in a single minute.

If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?

Input

Line 1: Two space-separated integers: N and K
Output

Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
Sample Input

5 17
Sample Output

4
Hint

The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.
Source

USACO 2007 Open Silver

题目概述:

一维生物John要抓奶牛,奶牛不会动,john每次可以左右动一个单位或者从当前位置x瞬移到2*x,问要动几次能抓到奶牛。
输入给出John的位置N和奶牛的位置K。

解题思路:

简单的BFS。

代码实现:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cmath>
#include<queue>
//#include <bits/stdc++.h>
using namespace std;

#define ms(i,j) memset(i,j,sizeof(i))
int n,k,mark[200005];
struct sb
{
    int n;
    int step;
} temp;
void bfs()
{
    sb now;
    temp.n=n;
    temp.step=0;
    queue<sb> line;
    line.push(temp);
    while(!line.empty())
    {
        now=line.front();
        line.pop();
        if(now.n==k)
        {
            printf("%d",now.step);
            return;
        }
        if(!mark[now.n-1]&&now.n-1>=0)
        {
            temp.n=now.n-1;
            temp.step=now.step+1;
            mark[temp.n]=1;
            line.push(temp);
        }
        if(!mark[now.n+1]&&now.n+1<=k)
        {
            temp.n=now.n+1;
            temp.step=now.step+1;
            mark[temp.n]=1;
            line.push(temp);
        }
        if(now.n<=k&&!mark[2*now.n])
        {
            temp.n=now.n*2;
            temp.step=now.step+1;
            line.push(temp);
            mark[temp.n]=1;
        }
    }
}

int main()
{
    scanf("%d%d",&n,&k);
    bfs();
}

猜你喜欢

转载自blog.csdn.net/weixin_43939327/article/details/86606461