codevs 3060 抓住那头奶牛 x

3060 抓住那头奶牛

 

USACO

 时间限制: 1 s
 空间限制: 16000 KB
 题目等级 : 黄金 Gold
 
题目描述 Description

农夫约翰被告知一头逃跑奶牛的位置,想要立即抓住它,他开始在数轴的N 点(0≤N≤100000),奶牛在同一个数轴的K 点(0≤K≤100000)。

约翰有两种移动方式:1 分钟内从x 点移动到x+1 或x-1;1 分钟内从x 点移动到2x。假设奶牛不会移动,约翰抓住它需要多少时间?

输入描述 Input Description

一行两个整数N 和K,用空格隔开。

输出描述 Output Description

约翰抓住它需要的最少时间

样例输入 Sample Input

5 17

样例输出 Sample Output

4

数据范围及提示 Data Size & Hint

见题目

分类标签 Tags 点此展开 

 
 
这道题的难点是你需要处理三种方向。我是直接进行枚举的
 
如下:
 
 1 #include<cstdio>
 2 #include<queue>
 3 #define maxn 100001
 4 
 5 using namespace std;
 6 
 7 int n,k;
 8 bool v[maxn];
 9 
10 struct node
11 {
12     int pos,step;
13 }cur,nxt;
14 
15 queue<node>q;//该队列是为了储存结构体中的pos,以及step 
16 
17 void Q_work()
18 {
19     cur.pos=n;
20     cur.step=0;//进行初始化 
21     q.push(cur);
22     v[n]=true;
23     if(n==k) //特判如果起点与重点是重合的 
24     {
25         printf("0");
26         return;
27     }
28     while(!q.empty())
29     {
30         cur=q.front();
31         q.pop();//取出队头元素,将其出队 
32         nxt.step=cur.step+1;//下一步一定是为当前的步数+1 
33         for(int i=1;i<=3;i++)
34          {
35              switch(i)//枚举行走的三种情况 
36              {
37                 case 1 : nxt.pos=cur.pos+1; break;
38                 case 2 : nxt.pos=cur.pos-1; break;
39                 case 3 : nxt.pos=cur.pos*2; break;
40              }
41              if(nxt.pos>=0&&nxt.pos<=100000&&!v[nxt.pos]) 
42              {//必须不超过边界并且当前并未走过
43                 if(nxt.pos==k)
44                 {
45                     printf("%d",nxt.step);//如果==k则说明已经到达,则进行输出 
46                     return;
47                 }
48                 q.push(nxt);//将其入队 
49                 v[nxt.pos]=true;//并进行标记 
50             }
51          }
52     }
53 }
54 
55 int main()
56 {
57     scanf("%d%d",&n,&k);
58     Q_work();
59     return 0;
60 }

 

posted @ 2017-04-25 21:53  夜雨声不烦  阅读(163)  评论(0编辑  收藏  举报