bfs入门题 抓住这头牛

题目:说给定农夫和牛的位置, 农夫可以向左走一步,可以向(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进队了 
                //就可以删除队首大的元素了
		
	}
	
	
	
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值