*题意:
相当于在一个数轴上给定农夫的位置n与牛的位置k。假定牛不懂,农夫每次有三种移动方式:n+1.n-1.n*2。问农夫最少移动几步后才能到牛的位置。
*思路:
用bfs寻找最短路径。
*代码:
#include<iostream>
#include<cstdio>
#include<cstring>
int queue[100001];
bool visit[100001];
int step[100001];
using namespace std;
void bfs(int n,int k)
{
memset(visit,0,sizeof(visit));
memset(step,0,sizeof(step));
int i,next,temp,flag=0;
int front=0,back=1;
visit[n]=1,queue[0]=n;
step[n]=0;
while(front<back)
{
temp=queue[front++];
for(i=0;i<3;i++)
{
if(i==0)next=temp+1;
else if(i==1)next=temp-1;
else next=temp*2;
if(next<=100000&&next>=0&&!visit[next])//保证数组不越界,注意判断顺序,若!visit[next]在前会越界。
{
visit[next]=1;
queue[back++]=next;
step[next]=step[temp]+1;
}
if(next==k)
{
flag=1;
break;
}
}
if(flag)
break;
}
cout<<step[k]<<endl;
}
int main()
{
int n,k;
cin>>n>>k;
if(n>=k)
cout<<n-k<<endl;
else
bfs(n,k);
return 0;
}
注:1、这道题是第一次看bfs,看过之后感觉虽然题很简单但是对理解bfs的运行过程还是比较有帮助的。
2、做这道提示注意不要让数组越界,所以有判断语句并且要注意次序(就是因为这个re了好多次)。