Catch That Cow

    xiaoxiao2026-04-24  6

    题目描述

    Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting. * Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute * Teleporting: FJ can move from any point X to the point 2 × X in a single minute. If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?

    输入

    Line 1: Two space-separated integers: N and K

    输出

    Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.

    示例输入

    5 17

    示例输出

    4

    提示

    题意:有一个农民和一头牛,他们在一个数轴上,牛在k位置保持不动,农户开始时在n位置。设农户当前在M位置,每次移动时有三种选择:1.移动到M-1;2.移动到M+1位置;3.移动到M*2的位置。问最少移动多少次可以移动到牛所在的位置。所以可以用广搜来搜索这三个状态,直到搜索到牛所在的位置。

    #include <iostream> #include <cstdio> #include <queue> #include <cstdlib> #include <cstring> using namespace std; int vis[200010],i; struct node { int step,data; }s,v; int bfs(int x,int k) { queue<struct node>q; s.data=x; s.step=0; q.push(s); while(!q.empty()) { v=q.front(); q.pop(); if(v.data==k) { printf("%d\n",v.step); return 1; } if(v.data>=1&&!vis[v.data-1]) { s.step=v.step+1; s.data=v.data-1; vis[v.data-1]=1; q.push(s); } if(v.data<=k&&!vis[v.data+1]) { s.step=v.step+1; s.data=v.data+1; vis[v.data+1]=1; q.push(s); } if(v.data<=k&&!vis[v.data*2]) { s.step=v.step+1; s.data=v.data*2; vis[v.data*2]=1; q.push(s); } } return -1; } int main() { int n,k; while(~scanf("%d%d",&n,&k)) { memset(vis,0,sizeof(vis)); vis[n]=1; bfs(n,k); } return 0; }

    //此题与最短步数那个题一样最短步数用BFS中的队列分层存取各种状态,这个队列中第一层是走一步的step=1,位置有三个,每一层所有的位置全部进入队列该层只要有到达的点此时的step就是满足条件的步数,步数一步一步依次加一,

    转载请注明原文地址: https://ju.6miu.com/read-1309184.html
    最新回复(0)