POJ - 3278 Catch That Cow 【bfs】

题目简述

Farmer John 已获悉一头逃亡奶牛的位置,并希望立即抓住她。 他从数轴上的点 N (0 ≤ N ≤ 100,000) 开始,而奶牛在同一数轴上的点 K (0 ≤ K ≤ 100,000) 处。 Farmer John 有两种交通方式:步行和传送。
步行:FJ可以在一分钟内从任意点 X 移动到点 X - 1 或 X + 1
传送:FJ可以在一分钟内从任意点 X 移动到点 2 × X。
如果母牛没有意识到它的追赶,根本不动,农夫约翰需要多长时间才能找回它?

输入

仅一行,输入N(0N100,000)K(0K100,000).

简析

bfs入门题,注意一个小技巧:
我们采用类似链表(或者并查集)的方法,记录每一个最短路径中的坐标,如下所示:

q.push(nxt);//当前坐标
vis[nxt]=1;
ans[nxt]=curr;//上一位置坐标

统计步数时,从终点倒推至起点:

while(k!=n){
	k=ans[k];
	Ans++;//步数
}

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define N 100005
int Ans=0;
int n,k;
bool vis[N];
int ans[N];//记录第i个位置的上一个位置 
void bfs(){
	queue<int>q;
	q.push(n);
	vis[n]=1;
	while(!q.empty()){
		int curr=q.front();
		if(curr==k) return;
		q.pop();
		for(int i=0;i<=2;i++){
			int nxt=0;
			if(i==0) nxt=curr-1;
			if(i==1) nxt=curr+1;
			if(i==2) nxt=2*curr;
			if(nxt<0 || nxt>100000 ||vis[nxt]) continue;
			q.push(nxt);
			vis[nxt]=1;
			ans[nxt]=curr;//标记当前位置 
		}
	}
}
int ip(){
	int x=0,w=0;char ch=0;
	while(!isdigit(ch)) w|=ch=='-',ch=getchar();
	while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return w?-x:x;
}
int main(){
	n=ip(),k=ip();
	bfs();
	while(k!=n){
		k=ans[k];
		Ans++;
	}
	printf("%d",Ans);
	return 0;
}
posted @   SxtoxA  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
12 13
点击右上角即可分享
微信分享提示