C++-抓住那头牛 解题思路

题目

【Horn Studio】编程专栏: 抓住那头牛 解题思路

题目描述

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
 
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?


输入

两个整数,N和K

输出

一个整数,农夫抓到牛所要花费的最小分钟数

样例输入 复制

5 17

样例输出 复制

4

提示

 

来源

思路

这道题是一道纯度极高又经典的BFS,

看到这还不知道什么是bfs?

C++-BFS 广搜的含义 - 冯子坤 - 博客园 (cnblogs.com)

农夫在每个点都有三条路可以选择,即类似于:在每一个结点都有三个相邻的结点。现在需要最短时间找到牛,所以用广搜是比较容易解决的。关键是要理清楚数据结构的问题。

因此,我们需要……无中生有暗度陈仓……生成一个数组,滨并将第一个设置为1(及走过的)

总之下来,这道题有点类似短路问题,确实BFS之中的精髓。

BFS版本代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int vis[5000000];
 4 int b[4];
 5 int n,k;
 6 queue <int> q;
 7 void bfs(int n){
 8     q.push(n);
 9     while(!q.empty()){
10         int tmp=q.front();
11         if(tmp==k){
12             cout<<vis[tmp]-1;
13             return;
14         }b[1]=tmp-1;
15         b[2]=tmp+1;
16         b[3]=2*tmp;
17         for(int i=1;i<4;i++){
18             if(vis[b[i]]==0&&b[i]>=0&&b[i]<4*k){
19                 q.push(b[i]);
20                 vis[b[i]]=vis[tmp]+1;
21             }
22         }q.pop();
23     }
24 }
25 int main(){
26     cin>>n>>k;
27     vis[n]=1;
28     bfs(n);
29     return 0;
30     
31 }

彩蛋

:很简单的~

 

posted @ 2022-03-27 09:33  冯子坤  阅读(1845)  评论(0编辑  收藏  举报