抓住那头牛
Posted malcolmmeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抓住那头牛相关的知识,希望对你有一定的参考价值。
题目链接http://noi.openjudge.cn/ch0205/2971/
- 描述
-
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟2、从X移动到2*X,每次移动花费一分钟假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛? - 输入
- 两个整数,N和K
- 输出
- 一个整数,农夫抓到牛所要花费的最小分钟数
- 样例输入
-
5 17
- 样例输出
-
4
查看
我用DFS无论怎么优化都超时,用BFS轻松就过了。这题比较适合用BFS,而且实现也比较容易。跟dfs一样,这里不需要显示的建图,每个状态看成一个节点,状态的转移看成边,状态的转移有三种方法,所以每个节点只有三条边,是确定的。
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<string> #include<vector> #include<queue> #define DEBUG(x) cout<<#x<<" = "<<x<<endl const int MAXN=1e5+10; using namespace std; struct Node{ int pos;///农夫的位置 int steps; Node(){} Node(int xx,int s):pos(xx),steps(s){} }; queue<Node>q; int visited[MAXN]; int main() { // freopen("in.txt","r",stdin); int N,K; cin>>N>>K; memset(visited,0,sizeof(visited)); q.push(Node(N,0)); visited[N]=true; while(!q.empty()){ Node t=q.front(); q.pop(); if(t.pos==K){ cout<<t.steps<<endl; return 0; } if(t.pos-1>=0&&!visited[t.pos-1]){ q.push(Node(t.pos-1,t.steps+1)); visited[t.pos-1]=true; } if(t.pos+1<=MAXN&&!visited[t.pos+1]){ q.push(Node(t.pos+1,t.steps+1)); visited[t.pos+1]=true; } if(t.pos*2<=MAXN&&!visited[t.pos*2]){ q.push(Node(t.pos*2,t.steps+1)); visited[t.pos*2]=true; } } }
以上是关于抓住那头牛的主要内容,如果未能解决你的问题,请参考以下文章