1.
张三想吃一顿全牛宴,所以用地上捡的石头雇佣傻子去为他抓牛
你可以将图视为一条只有x的坐标的轴
而你作为神通广大的傻子拥有两个能力
- 你可以让牛当前位置由x变为x+1或者x-1
- 你可以让牛当前位置由x变为2*x
你能得出你最少需要多少次操作能将牛赶往指定地点吗?
Input
输入包含两个数字n,k分别代表牛的起始位置和目标地点的x坐标。
n,k均大于等于0且小于等于100000
Output
输出最少的操作次数
Sample Input
5 17
Sample Output
4
思路:广搜。
代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
#include<string.h>
#include<queue>
struct pp
{
int x,y;
}que;
queue<pp>q;
int k;
int book[100010];
void dfs(int n)
{
que.x=n;
while(!q.empty())
{
q.pop();
}
q.push(que);
while(!q.empty())
{
pp n1=q.front();
q.pop();
for(int i=0; i<3; i++)
{
pp n2;
if(i==0)
n2.x=n1.x*2;
else if(i==1)
n2.x=n1.x-1;
else
n2.x=n1.x+1;
if(n2.x<0||n2.x>100000||book[n2.x])
continue;
n2.y=n1.y+1;
book[n2.x]=1;
if(n2.x==k)
{
printf("%d\n",n2.y);
return ;
}
q.push(n2);
}
}
return ;
}
int main()
{
int n;
scanf("%d%d",&n,&k);
if(n==k)
printf("0\n");
else if(n>k)
printf("%d\n",n-k);
else
{
memset(book,0,sizeof(book));//初始化
book[n]=1;
dfs(n);
}
return 0;
}