poj3278 Catch That Cow赶上那头牛

描述

农夫约翰已被告知逃亡母牛的位置,并希望立即抓住她。他开始于一个点Ñ(0≤ Ñ ≤100,000)上的数线和牛是在点ķ(0≤ ķ上相同数目的线≤100,000)。农夫约翰有两种交通方式:步行和传送。

*步行:FJ可以在一分钟内从任意点X移动X -1或X + 1 
*传送:FJ可以在一分钟内从任意点X移动到2× X

如果母牛不知道它的追求,根本不动,那么农夫约翰需要多长时间才能找回它?

 

输入

第1行:两个以空格分隔的整数:NK.

产量

第1行:Farmer John捕获逃亡牛所需的最短时间(以分钟为单位)。

样本输入

5 17

样本输出

4

提示

农夫约翰到达逃亡牛的最快方法是沿着以下路径前进:5-10-9-18-17,需要4分钟。
 

代码思路:
 
//poj3278 Catch That Cow
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
/*
思路:
一维数组上的广搜

广搜模板
队列起点入队 到终点广搜结束

bfs过程 广搜枚举走法 建图的过程 
step记录步数
visited记录该点是否走过 

*/
int N,K;
const int MAXN = 100000;
int visited[MAXN+10];  // 判重标记,visited[i] = true 表示i 已经扩展过
struct Step{
    int x; // 位置
    int steps; // 到达x 所需的步数
    Step(int xx,int s):x(xx),steps(s) { } 
};
queue<Step> q; // 队列, 即Open 表

int main() {
    cin >> N >> K;
    memset(visited,0,sizeof(visited));
    q.push(Step(N,0));
    visited[N] = 1;    

    while(!q.empty()) {
        Step s = q.front();
        if( s.x == K ) { // 找到目标
            cout << s.steps <<endl;
            return 0;
        }else {
            if( s.x - 1 >= 0 && !visited[s.x-1] ) {
                q.push(Step(s.x-1,s.steps+1));
                visited[s.x-1] = 1;
            }
            if( s.x + 1 <= MAXN && !visited[s.x+1] ) {
                q.push(Step(s.x+1,s.steps+1));
                visited[s.x+1] = 1;
            }
            if( s.x * 2 <= MAXN &&!visited[s.x*2] ) {
                q.push(Step(s.x*2,s.steps+1));
                visited[s.x*2] = 1;
            }
            q.pop();
        }
    }
    return 0;
}

 

超时代码:

#include<iostream>
#include<cstring>
using namespace std;
/*
思路:
一维数组上的广搜

广搜模板
队列起点入队 到终点广搜结束

bfs过程 广搜枚举走法 建图的过程 
step记录步数
visited记录该点是否走过 

*/

const int MAXN = 100000;
int a[MAXN+10];
int n,k;

int visited[MAXN+10];
int step[MAXN+10];

int main(){
    cin>>n>>k;
    if(n>=k){
        cout<<n-k<<endl;
        return 0;
    }
    memset(visited,0,sizeof(visited));
    int head = 0,tail = 0;
    a[tail] = n;
    step[a[tail]] = 0;
    visited[a[tail]] = 1;
    tail++;
    while(head<tail){
        int x = a[head];
        if(x == k){
            cout<<step[k]<<endl;
            return 0;
        }
        for(int i=1;i<=3;i++){
            if(i==1){
                if(!visited[x+1] && x+1<=MAXN){
                    int tx = x + 1;
                    visited[x] = 1;
                    a[tail++] = tx;
                    step[tx] = step[x] + 1;
                }
            }else if(i==2){
                if(!visited[2*x] && x*2 <= MAXN){
                    int tx = 2 * x;
                    visited[tx] = 1;
                    a[tail++] = tx;
                    step[tx] = step[x] + 1;
                }
            }else{
                if(!visited[x-1] && x-1 >=0){
                    int tx = x -1;
                    visited[tx] = 1;
                    a[tail++] = tx;
                    step[tx] = step[x] + 1;
                }
            }
        }
        head++;
    }
}
posted @ 2018-08-01 11:54  fishers  阅读(412)  评论(0)    收藏  举报