poj3278 openjudge4001 抓住那头牛 解题报告

本文介绍了一个经典的广度优先搜索(BFS)算法应用案例——农夫如何最快地抓住静止不动的牛。通过定义状态转移方程并利用队列实现节点扩展,文章详细展示了如何使用C++实现该算法,并给出了完整的代码示例。
总时间限制: 
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<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int SIZE = 100010;
int farmer, cow;
struct Loc
{
	int x;
	int step;
	Loc(int a, int b) :x(a), step(b) {}
};
queue<Loc>location;
bool walked[SIZE+10];
int main()
{
	cin >> farmer >> cow;
	memset(walked, 0, sizeof(walked));
	location.push(Loc(farmer, 0));
	walked[farmer] = true;
	while (!location.empty()) {
		Loc tmp = location.front();
		if (tmp.x == cow) {
			cout << tmp.step;
			break;
		}
		if (tmp.x >= 1 && !walked[tmp.x - 1]) {
			location.push(Loc(tmp.x - 1, tmp.step + 1));
			walked[tmp.x - 1] = true;
		}
		if (tmp.x <= SIZE - 1 && !walked[tmp.x + 1]) {
			location.push(Loc(tmp.x + 1, tmp.step + 1));
			walked[tmp.x + 1] = true;
		}
		if (tmp.x <= SIZE / 2 && !walked[tmp.x * 2]) {
			location.push(Loc(tmp.x * 2, tmp.step + 1));
			walked[tmp.x * 2] = true;
		}
		location.pop();
	}
	return 0;
}
大概这样,感觉广搜的想法很巧妙啊~~~还要继续学习QAQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值