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 }
彩蛋
:很简单的~