抓住那头牛
2014-11-13 20:21
204 查看
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入
5 17
样例输出
4
每一个位置都有三种方式可以走即退一步(-1),进一步(+1),跳着走(*2),而不论走的是哪一种,走到下一步又同样会有三种方式,因此从第一步起将每一种可能(即走到的位置)存到队列里,利用队列先进先出的特性遍历每一种可能,一找到“牛”就停止说明所用时间最少。
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入
5 17
样例输出
4
每一个位置都有三种方式可以走即退一步(-1),进一步(+1),跳着走(*2),而不论走的是哪一种,走到下一步又同样会有三种方式,因此从第一步起将每一种可能(即走到的位置)存到队列里,利用队列先进先出的特性遍历每一种可能,一找到“牛”就停止说明所用时间最少。
#include<stdio.h> #include<stdlib.h> #define M 100001 typedef struct { int num[M]; int front; int rear; int size; }queue; void add(queue *p,int item) { p->rear=(p->rear+1)%M; p->num[p->rear]=item; p->size++; } int dele(queue *p) { p->front = (p->front+1)%M; p->size--; return p->num[p->front]; } int main() { queue *p; int n,k,s[M]={0},m=0; scanf("%d %d",&n,&k); if(k<n) printf("%d\n",n-k);//当k<n时只能拿来减 else { p=(queue*)malloc(sizeof(queue)); p->front=p->rear=p->size=0; add(p,n); while(1) { m=dele(p); if(m==k) break; if(m>0 && s[m-1]==0)//s[m-1]==0表示不能重复走过的路 { add(p,m-1); s[m-1]=s[m]+1; } if(s[m+1]==0) { add(p,m+1); s[m+1]=s[m]+1; } if(2*m<M && s[2*m]==0)//m>0.2*m<M表示不能越界,否则会错误 { add(p,2*m); s[2*m]=s[m]+1; } } printf("%d\n",s[m]); } return 0; }
相关文章推荐
- 数据结构与算法MOOC / 第三章 栈与队列 练习题 8:抓住那头牛
- 抓住那头牛
- noi 2971 抓住那头牛
- 广度优先搜索--抓住那头牛(poj 3278)
- 算法练习题之抓住那头牛
- 3060 抓住那头奶牛 USACO
- 倒计时三天——抓住那头牛
- 抓住那头牛(广搜)
- codevs 3060 抓住那头奶牛 x
- OpenJudge 2.5-2971 Catch That Cow(抓住那头牛)
- 抓住那头牛
- openjudge 2971:抓住那头牛 解题报告
- openjudge-noi-2.5-2971:抓住那头牛
- poj 3278 bfs(抓住那头牛)
- 【BFS】(一)抓住那头牛(poj 3278)
- 2971:抓住那头牛
- 广度搜索(BFS)入门题目:抓住那头牛
- 【Openjudge2971】 抓住那头牛 广搜+剪枝
- POJ3278 抓住那头牛
- 【openjudge】抓住那头牛