poj 3278 bfs(抓住那头牛)

来源:互联网 发布:北京java晚班 编辑:程序博客网 时间:2024/05/16 01:40
题意:农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟

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

思路:简单bfs即可。可以自己手动写队列,也可以用stl,注意结构体的初始化操作写法。

手动队列:

#include <stdio.h>#include <string.h>#define N 100005int q[N],flag[N];int n,m,now;int rear,front;int test(int x){if(x<0 || x>100000 ||flag[x])return 0;return 1;}void enter(int x){q[++rear] = x;flag[x] = flag[now]+1;}int main(){//freopen("a.txt","r",stdin);while(scanf("%d %d ",&n,&m)!=EOF){memset(flag,0,sizeof(flag));rear = front = -1;q[++rear] = n;flag[n] = 1;while(front < rear){now = q[++front];if(now == m){printf("%d\n",flag[now]-1);break;}if(test(now+1))enter(now+1);if(test(now-1))enter(now-1);if(test(now*2))enter(now*2);}}return 0;}

stl的queue:

#include <cstdio>#include <string>#include <queue>#include <iostream>#include <cstdlib>#include <cmath>#include <algorithm>#define INF 0x3fffffffusing namespace std;#define N 100000int used[N+5];struct node{    int step,id;    node(int ll,int ii):step(ll),id(ii){};};queue<node> q;int n,m;int main(){    struct node p(0,0);    memset(used,0,sizeof(used));    scanf("%d %d",&n,&m);    q.push(node(0,n));    used[n] = 1;    while(!q.empty()){        p = q.front();        if(p.id == m){            printf("%d\n",p.step);            break;        }        if(p.id>0 && !used[p.id-1]){            q.push(node(p.step+1,p.id-1));            used[p.id-1] = 1;        }        if(p.id<N && !used[p.id+1]){            q.push(node(p.step+1,p.id+1));            used[p.id+1] = 1;        }        if(p.id*2<=N && !used[p.id*2]){            q.push(node(p.step+1,p.id*2));            used[p.id*2] = 1;        }        q.pop();    }    return 0;}


0 0
原创粉丝点击