题目:说给定农夫和牛的位置, 农夫可以向左走一步,可以向(x-1)和(x+1)走,也可以向(x*2)走,问农夫最少走几步抓住牛 #include<iostream> #include<algorithm> #include<queue> using namespace std; const int MAXN=100000; int N,K; int vis[MAXN+5]={0}; struct step{ int x;//位置 int steps;//步数 step(int xx,int s):x(xx),steps(s){} }; int main(){ cin>>N>>K; queue<step> q;//构建一个队列 q.push(step(N,0));//把农夫最开始的位置 和步数push进队 vis[N]=1; //标记成 走过 while(!q.empty()){//如果q不为空 就继续循环 step a=q.front();//构建一个局部 变量a 将对头的元素给他 if(a.x==K){//如果a.x等于K了,说明抓到牛了 cout<<a.steps;//直接输出步数 就是最小步数 return 0; } if(a.x-1>=0&&!vis[a.x-1]){//判断可不可以x-1,并且x-1处没走过 q.push(step(a.x-1,a.steps+1));//可以的话 x-1 步数+1 push进队列 vis[a.x-1]=1;//标记 } if(a.x+1<=MAXN&&!vis[a.x+1]){//情况2 q.push(step(a.x+1,a.steps+1)); vis[a.x+1]=1; } if(a.x*2<=MAXN&&!vis[a.x*2]){//情况3 q.push(step(a.x*2,a.steps+1)); vis[a.x*2]=1; } q.pop();//每循环一次都把队首可走的情况(也就是树的下一层)push进队了 //就可以删除队首大的元素了 } }