注解
1、广度优先遍历BFS,三种情况:加一,减一,乘二。
2、注意边界!要先判断是否在[0,100000]范围,如果在,再判断是否访问过该位置。此顺序不能变化,否则会发生数组越界!导致ACCESS_VIOLATION。
代码
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 100001;
int N, K;
int visit[MAXN];
struct Node{
int f;
int step;
};
int bfs(){
queue<Node> q;
Node node;
node.f = N;
node.step = 0;
visit[N] = 1;
q.push(node);
while(q.size()>0){
Node top = q.front();
q.pop();
if(top.f==K){
return top.step;
}
else{
int step = top.step+1;
int next1 = top.f + 1;
int next2 = top.f - 1;
int next3 = top.f * 2;
if(next1<MAXN && visit[next1]==0){
Node tmp;
tmp.f = next1;
tmp.step = step;
q.push(tmp);
visit[next1] = 1;
}
if(next2>=0 && visit[next2]==0){
Node tmp;
tmp.f = next2;
tmp.step = step;
q.push(tmp);
visit[next2] = 1;
}
if(next3<MAXN && visit[next3]==0){
Node tmp;
tmp.f = next3;
tmp.step = step;
q.push(tmp);
visit[next3] = 1;
}
}
}
return -1;
}
int main(){
while(~scanf("%d %d", &N, &K)){
memset(visit, 0, sizeof(visit));
int ans = bfs();
printf("%d\n", ans);
}
return 0;
}