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。
如果母牛没有意识到它的追赶,根本不动,农夫约翰需要多长时间才能找回它?
输入
仅一行,输入和 .
简析
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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!