题意:
在一维的直线上给出john和牛的位置,通过固定的规则求出他抓到牛经过的最少步数。
解析:
本题可以理解为给定两个数n,k通过 n-1; n+1; n*2这三种运算求得最后等于k时经过的最少步数。
本题主要考察广度搜索(BFS)。
思路:
利用队列来模拟这个过程。
源代码:
#include <iostream>
#include <queue>
#define MAX 100001
using namespace std;
int step[MAX]; //跟随数组记录到达一个位置所经过的步数。
bool visit[MAX]; //标志数组 用来标记此元素是否已经被访问过。
queue<int> q;
int bfs(int n,int k) //广度搜索 核心
{
int next,head; //记录当前数和他的分支(head-1/head+1/head*2)
q.push(n); //将第一个数入队
step[n]=0;
visit[n]=true; //标记第一个数已经被访问
while(!q.empty())
{
head=q.front();
q.pop();
for(int i=0;i<3;i++) //形成3个分支
{
if(i==0)
next=head-1;
else if(i==1)
next=head+1;
else next=head*2;
if(next>MAX||next<0) //判断是否越界
continue;
if(!visit[next])
{
q.push(next);
step[next]=step[head]+1;
visit[next]=1;
if(next==k) //此判断条件可以放在此处也可以放在if 之外;因为如果放在外面一种是 //经过if语句的,一种是没有,如果经过放在里面即可;如果没有则说明 //此数已被访问,那一定以前经过了if语句。
return step[next];
}/*if(next==k) return step[next】;*/
}
}
}
int main()
{
int n,k;
cin>>n>>k;
if(n>=k)
cout<<n-k;
else
cout<<bfs(n,k);
return 0;
}