zoukankan      html  css  js  c++  java
  • POJ 3278

    题目链接:http://poj.org/problem?id=3278

    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 - 1 or + 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

    题意:

    有一条数字线段 $[0,100000]$,已知农场主在位置 $N$,逃亡的奶牛在位置 $K$ 不移动,现在农场主在每一分钟都可以有三种行进方式:

    往右走一步,往左走一步,传送到为当前位置的两倍的地方;

    求最短多少分钟可以抓到奶牛。

    题解:

    显然是BFS,农场主每行进一次,相当于BFS往下搜一层,那么所有BFS搜索到的位置的深度就相当于行进时间(并且就是到达这个位置的最短时间),

    如果某一层遇到了奶牛,就直接终止BFS即可。

    时间复杂度:所有的点只会进队一次,$O(N)$。

    AC代码:

    #include<iostream>
    #include<cstring>
    #include<queue>
    using namespace std;
    
    const int maxn=100000;
    
    int n,k;
    int d[maxn+10];
    bool vis[maxn+10];
    
    inline bool ok(int x)
    {
        if(0<=x && x<=maxn) return 1;
        else return 0;
    }
    void bfs()
    {
        queue<int> q;
        q.push(n);
        d[n]=0;
        vis[n]=1;
        while(!q.empty())
        {
            int now=q.front(); q.pop();
            if(now==k) return;
            int x1=now+1,x2=now-1,x3=2*now;
            if(ok(x1) && !vis[x1]) q.push(x1),d[x1]=d[now]+1,vis[x1]=1;
            if(ok(x2) && !vis[x2]) q.push(x2),d[x2]=d[now]+1,vis[x2]=1;
            if(ok(x3) && !vis[x3]) q.push(x3),d[x3]=d[now]+1,vis[x3]=1;
        }
    }
    
    int main()
    {
        cin>>n>>k;
        memset(vis,0,sizeof(vis));
        bfs();
        cout<<d[k]<<endl;
    }
  • 相关阅读:
    ExtJS小试 TreePanel
    ExtJS 之panel tabpanel 和window 的简单使用
    ExtJs2.1未知明错误
    Extjs xtype
    ibatis 初体验
    MS数据库分页
    EXTJS 简单登陆
    php5.2.9 apache2.2 mysql5.1 phpMyAdmin3.2配置
    安装配置Ruby for Eclipse
    ExtJs之gridPanel初探
  • 原文地址:https://www.cnblogs.com/dilthey/p/9678263.html
Copyright © 2011-2022 走看看