Description
给定两个整数n和k,通过 n+1或n-1或n*2 这3种操作,使得n=k,输出最少的操作次数(0≤n≤100,000)
Input
两个整数n和k
Output
输出最少操作次数
Sample Input
5 17
Sample Output
4
Solution
简单bfs
Code
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
queue<int> que;
int n,k;
int dis[100005];
bool vis[100005];//标记数组
int main()
{
scanf("%d%d",&n,&k);
que.push(n);//起点入队
memset(vis,false,sizeof(vis));//初始化
memset(dis,false,sizeof(dis));//初始化
while(!que.empty())
{
int x=que.front();
que.pop();
if(x==k)//到达终点
{
printf("%d\n",dis[x]);
break;
}
if(x-1>=0&&!vis[x-1])//不能超出区域
{
vis[x-1]=true;//标记该点
que.push(x-1);//入队
dis[x-1]=dis[x]+1;//操作数加一
}
if(x+1<=100000&&!vis[x+1])//不能超出区域
{
vis[x+1]=true;//标记该点
que.push(x+1);//入队
dis[x+1]=dis[x]+1;//操作数加一
}
if(2*x<=100000&&!vis[x<<1])//不能超出区域
{
vis[x<<1]=true;//标记该点
que.push(x<<1);//入队
dis[x<<1]=dis[x]+1;//操作数加一
}
}
return 0;
}