您的位置:首页 > 编程语言 > PHP开发

acm-bfs入门(抓住奶牛)

2012-08-08 15:52 197 查看

2054: 抓住奶牛!

Time Limit: 1 Sec  Memory Limit:
64 MB
Submit: 135  Solved: 27

[Submit][Status][Web Board]

Description

不得了,xiaoC的农场里跑出来了一只奶牛,这可是让xiaoC很是揪心啊,于是xiaoC立刻放下了手头的工作,想疯狂的奶牛奋力追去,但说来也怪,xiaoC的走法还真有一点特殊,他每一步有两种走法: 步行:xiaoC可以从任何X位置,一步走到X-1或X+1位置 跳跃:xiaoC可以从任意X位置,一步跳跃到2*X的位置 现在我们假设奶牛并没有意识到xiaoC的追来,还在原地傻傻地站着,请你来帮xiaoC计算一下,他需要多少步,才能把奶牛逮住!!!

Input

每个测试实例为一行,包含两个数据,N和K,N表示xiaoC现在的位置,K表示奶牛的位置,0 ≤ N,K ≤ 100,000

Output

输出xiaoC能逮住奶牛的最少步数,每个测试实例输出一行

Sample Input

5 17

Sample Output

4

HINT

在这个实例中最快的路径为5-10-9-18-17,共四步

BFS

基础的bfs题目:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
int pos; //当前位置
int step; //达到当前位置的步数
}node;

typedef struct queue //定义队列
{
int front;
int rear;
node s[300000];
}queue;

queue bark;
int flag[300000]; //标记数组用来记录当前位置是否走过

//进入队列
void enqueue(node k)
{
bark.s[bark.rear]=k;
bark.rear++;
}
//出队列
node dequeue()
{
int t=bark.front;
bark.front++;
return bark.s[t];
}
//判断队列是否为空
int isempty()
{
if(bark.front == bark.rear)return 1;
else return 0;
}
int minstep(int n,int end)
{
node k,t;
bark.front = bark.rear=1;
k.pos=n;k.step=0;
flag
=1;
enqueue(k); //第一个点进入队列
while(!isempty())
{
k=dequeue();
flag[k.pos]=1; //弹出队头元素,然后广搜
if(k.pos==end)return k.step; //满足条件,输出结果
if(k.pos<end && 1!=flag[k.pos+1]) //可以向后走 X-1
{
t.pos = k.pos+1;
t.step = k.step+1;
flag[t.pos]=1;
enqueue(t); //满足条件的节点入队
}
if(k.pos>0 && 1!=flag[k.pos-1]) //可以向前走 X+1
{
t.pos = k.pos-1;
t.step = k.step+1;
flag[t.pos]=1;
enqueue(t);
}
if(k.pos<end && 1!=flag[k.pos*2]) //可以向前走 X*2
{
t.pos=k.pos*2;
t.step=k.step+1;
flag[t.pos]=1;
enqueue(t);
}
}
return 0;
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(flag,0,sizeof(flag)); //标记数组初始化
printf("%d\n",minstep(n,k));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息