这题我做的时候经常出现是3倍的答案,后来看了的网友的发现是自己在判断重复计算,这里的代码是参考网友的,
8:抓住那头牛
-
总时间限制:
- 2000ms 内存限制:
- 65536kB
-
描述
-
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
输入
- 两个整数,N和K 输出
- 一个整数,农夫抓到牛所要花费的最小分钟数 样例输入
-
5 17
样例输出
-
4
-
#include<cstdio> #include<iostream> #include<cstring> #include<queue> #define max 1000000 using namespace std; int vis[max]={0}; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { if(n>m) { printf("%d\n",n-m); continue; } memset(vis,0,sizeof(vis)); queue<int>q; q.push(n); int t=0; while(!q.empty()) { t=q.front(); q.pop(); if(t==m) { break; } if(t>0&&!vis[t-1]) { q.push(t-1); vis[t-1]=vis[t]+1; } if(t<m&&!vis[t+1]) { q.push(t+1); vis[t+1]=vis[t]+1; } if(t*2<max&&!vis[2*t]) { q.push(2*t); vis[2*t]=vis[t]+1; } } printf("%d\n",vis[t]); } return 0; }