题目大意:
输入一个N和K,N为人的起始位置,K为牛的位置,牛不动,人有三种移动方式,向前一步,向后一步,或移动到当前位置坐标的二倍处,求移动到牛位置的最少次数。
解题思路:
使用广搜(BFS),对人当前位置的三种移动方式进行搜索,所得出的即为最少移动次数。
参考代码:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int mark[100100];
int N,K;
struct node
{
int x,step;
};
int check(int x)
{
if(x<0||x>=100100||mark[x])
return 0;
return 1;
}
int bfs(int x)
{
queue <node> q;
node now,next;
now.x=x;
now.step=0;
q.push(now);
mark[now.x]=1;
while(!q.empty())
{
now=q.front();
q.pop();
if(now.x==K)
return now.step;
for(int i=0;i<3;i++)
{
next=now;
if(i==0)
next.x=now.x+1;
else if(i==1)
next.x=now.x-1;
else if(i==2)
next.x=now.x*2;
next.step=now.step+1;
if(next.x==K)
return next.step;
if(check(next.x))
{
mark[next.x]=1;
q.push(next);
}
}
}
return -1;
}
int main()
{
while(scanf("%d%d",&N,&K)!=EOF)
{
memset(mark,0,sizeof(mark));
printf("%d\n",bfs(N));
}
return 0;
}