• Catch That Cow bfs()经典 按顺序求最大值


    Problem Description

    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 - 1 or + 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?

     
    Input
    Line 1: Two space-separated integers: N and K
     
    Output
    Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
     
    Sample Input
    5 17
     
    Sample Output
    4
    ***************************************************************************************************************************
    两个方向  三种选择  :-1,1,2*;
    ***************************************************************************************************************************
     1 #include<iostream>
     2 #include<string>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<cstdio>
     6 #include<queue>
     7 using namespace std;
     8 int vis[100010];
     9 int n,i,j,k;
    10 int cnt;
    11 int main()
    12 {
    13    while(scanf("%d%d",&n,&k)==2)
    14    {
    15        queue<int>Q;
    16        while(!Q.empty())
    17         Q.pop();
    18        memset(vis,0,sizeof(vis));
    19        Q.push(n);
    20        while(!Q.empty())
    21        {
    22            int t=Q.front();
    23            if(t==k)
    24             break;
    25            Q.pop();
    26            if(t>0&&!vis[t-1])
    27            {
    28                int z=t-1;
    29                vis[z]=vis[t]+1;
    30                Q.push(z);
    31            }
    32            if(t<k&&!vis[t+1])
    33            {
    34                int z=t+1;
    35                vis[z]=vis[t]+1;
    36                Q.push(z);
    37            }
    38            if(2*t<100005&&!vis[2*t])
    39            {
    40                int z=2*t;
    41                vis[z]=vis[t]+1;
    42                Q.push(z);
    43            }
    44 
    45        }
    46        printf("%d
    ",vis[k]);
    47    }
    48    return 0;
    49 }
    View Code
     
  • 相关阅读:
    2021.4.14
    每日总结
    每日总结
    每日总结
    oracle db组面试 复习数据库
    二叉树根结点到叶节点的最短距离
    minheap 最小堆的实现
    Maximum element in a sorted and rotated array排序和旋转数组中的最大元素
    树和图bfs的一个共同点
    117. Populating Next Right Pointers in Each Node II 不完全二叉树连接右边节点
  • 原文地址:https://www.cnblogs.com/sdau--codeants/p/3364182.html
Copyright © 2020-2023  润新知