抓住那头牛【题解】

一个玄学的广搜边界>=0,<=k+10,这个边界可能可以数学上证明,其他就是简单的广搜,然后输出步数,就可以了

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define N 100010
using namespace std;
struct ddd
{
	int x,s;
};
int n,k;
bool used[N*10];
void bfs(int x)
{
	queue<ddd> s;
	ddd k1;
	k1.x=x;
	k1.s=0;
	s.push(k1);
	while(!s.empty())
	{
		ddd k2,k3;
		k2=s.front();
		s.pop();
		if(k2.x==k)
		{
			cout<<k2.s<< endl;
			exit(0);
		}
		k3.x=k2.x*2;
		k3.s=k2.s+1;
		if(k3.x>=0&&k3.x<=N&&!used[k3.x])
		{
			used[k3.x]=true;
			s.push(k3);
		}
		for(int i=-1;i<=1;i+=2)
		{
			k3.x=k2.x+i;
			k3.s=k2.s+1;
			if(k3.x>=0&&k3.x<=N&&!used[k3.x])
			{
				used[k3.x]=true;
				s.push(k3);
			}
		}
	}
}
int main()
{
	cin>>n>>k;
	if(n==k)
	{
		cout<<"0"<< endl;
		return 0;
	}
	bfs(n);
	return 0;
}

原文地址:https://www.cnblogs.com/xzx-1228/p/10976476.html

时间: 2024-10-29 15:59:56

抓住那头牛【题解】的相关文章

2971 抓住那头牛 noi.openjudge

http://noi.openjudge.cn/ch0205/2971/ 总时间限制:  2000ms 内存限制:  65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动花费一分钟 2.从X移动到2*X,每次移动花费一分钟 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? 输入 两个整数

OpenJudge 2971 抓住那头牛

总时间限制:  2000ms 内存限制:  65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动花费一分钟 2.从X移动到2*X,每次移动花费一分钟 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? 输入 两个整数,N和K 输出 一个整数,农夫抓到牛所要花费的最小分钟数 样例输入 5 1

2971:抓住那头牛

总时间限制: 2000ms 内存限制: 65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动花费一分钟 2.从X移动到2*X,每次移动花费一分钟 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? 输入 两个整数,N和K 输出 一个整数,农夫抓到牛所要花费的最小分钟数 样例输入 5 17

openjudge 2971:抓住那头牛 解题报告

总时间限制: 2000ms 内存限制:  65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动花费一分钟. 2.从X移动到2*X,每次移动花费一分钟. 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? 输入 两个整数,N和K 输出 一个整数,农夫抓到牛所要花费的最小分钟数 样例输入 5

抓住那头牛

[题目描述] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0 <= N <= 100000),牛位于点K(0 <= K <= 100000).农夫有两种移动方式: (1)从X移动到X-1或X+1,每次移动花费一分钟: (2)从X移动到2*X,每次移动花费一分钟: 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? [输入描述] 输入两个整数N.K. [输出描述] 输出一个整数,农夫抓到牛所要花费的最小分钟数. [样例输入] 5

OpenJudge 4001:抓住那头牛

题目链接 题解: 这个题可以用广搜来解决,从农夫到牛的走法每次都有三种选择,定义一个队列,把农夫的节点加进队列,然后以这三种走法找牛,队列先进先出,按顺序直到找到牛的位置. 代码: #include<iostream> #include<stdio.h> #include<queue> #include<cstring> using namespace std; int n,k; #define MAX 1e5 const int MAX_N=1e5+5;

bfs 抓住那头牛

这是题目呀!http://ybt.ssoier.cn:8088/problem_show.php?pid=1253 算法分析:看到这道题目要求为最短时间,就可以判断用bfs(按照距开始状态由远及近的顺序进行搜索),而不是dfs. 在搜索过程中还可能遇到重复搜索的结果,这时我们就可以引入一个队列,使得已搜过的节点入队,再以此为下一层的父节点出队,以此往复. #include <iostream> #include<cstdio> #include <queue>#defi

bzoj1646[Usaco2007 Open]Catch That Cow 抓住那只牛*

bzoj1646[Usaco2007 Open]Catch That Cow 抓住那只牛 题意: 数轴上,起点在n,终点在k,每次走可以向左走一步或向右走一步或瞬移到当前坐标的两倍位置,问最少走几次.0≤n,k≤100000. 题解: bfs,允许走的位置边界为[0,max(n,k)+1].下界为0原因是如果走到小于0的位置,k≥0,则瞬移和往左走都是南辕北辙,只能向右走,那么一开始就不应该走到小于0的位置导致浪费时间.上界为max(n,k)+1的原因是如果你走到了大于这个数的位置,k必定小于当

codevs 3060 抓住那头奶牛 x

3060 抓住那头奶牛 USACO 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 农夫约翰被告知一头逃跑奶牛的位置,想要立即抓住它,他开始在数轴的N 点(0≤N≤100000),奶牛在同一个数轴的K 点(0≤K≤100000). 约翰有两种移动方式:1 分钟内从x 点移动到x+1 或x-1:1 分钟内从x 点移动到2x.假设奶牛不会移动,约翰抓住它需要多少时间? 输入描述 Input Description 一行两个整数N 和K