题目描述:
给定两个-100到100的整数x和y,对x只能进行加1,减1,乘2操作,问最少对x进行几次操作能得到y?
例如:
a=3,b=11: 可以通过322-1,3次操作得到11;
a=5,b=8:可以通过(5-1)*2,2次操作得到8;
输入描述:
输入以英文逗号分隔的两个数字,数字均在32位整数范围内。
输出描述:
输出一个数字
输入:
3,11
输出:
3
题意:
题目描述
题解:
暴力搜索
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 100000 + 5;
int step[maxn],vis[maxn];
queue<int>q;
int bfs(int n,int k){
int now,next;
step[n] = 0;
vis[n] = 1;
q.push(n);
while(!q.empty()){
now = q.front();
q.pop();
for(int i = 1; i <= 3; i++){
if(i == 1) next = now - 1;
else if(i == 2) next = now + 1;
else if(i == 3) next = now * 2;
if(next < 0 || next > maxn) continue;
if(!vis[next]){
vis[next] = 1;
q.push(next);
step[next] = step[now] + 1;
}
if(next == k) return step[next];
}
}
}
int main(){
int n,k;
while(scanf("%d,%d",&n,&k)!=EOF){
if(n >= k) printf("%d\n",n - k);
else printf("%d\n",bfs(n,k));
}
return 0;
}