题意:农夫在n,奶牛在m,农夫可以进行一下操作:
FJ can move from any point X to the points X - 1 or X + 1 in a single minute
FJ can move from any point X to the point 2 × X in a single minute.
也就是说农夫可以进行x-1,x+1,2*x三种操作,问最少几部内可以抓到奶牛。
首先如果n>m,农夫肯定只能进行x-1操作来返回,才能抓到牛,这是需要花费n-m次操作。
这是道很水的BFS的模板题,从农夫位置开始,持续的对n-1,n+1,2*n进行搜索即可,搜到了就返回步数。
代码如下:
#include <iostream> #include <stdio.h> #include <math.h> #include <queue> #include <string.h> int flag[100002]; using namespace std; int n,m,cnt; queue<int> q; int bfs(int i,int j) { q.push(i); int date,d; flag[i]=1; while(!q.empty()) { date=q.front(); q.pop(); for(int k=0;k<3;k++) { if(k==0) d=date+1; else if(k==1) d=date-1; else if(k==2) d=date*2; if(d>=0&&d<=100000&&flag[d]==0) { flag[d]=flag[date]+1; //printf("%d %d\n",d,flag[d]); q.push(d); if(d==j) return flag[d]-1; } } } return 0; } int main() { while(cin>>n>>m) { memset(flag, 0, sizeof(flag)); cnt=0; if(n>m) printf("%d\n",n-m); else printf("%d\n",bfs(n, m)); } }