思路:
- 以后再见就会了~
- 广搜的小变体:因为:每次有三种移动方式,用过的点不会再用。
代码:
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
struct node{
int x;
int dis;
friend bool operator > (node a , node b){
return a.dis > b.dis;
}
node(int x,int dis) : x(x) , dis(dis) {} ;
};
int ans;
int n,k;
priority_queue<node , vector<node> , greater<node> > Q;
bool vis[100005];
bool check(int x){
if(x > 100000 || x < 0)
return false;
return true;
}
void bfs(){
if(n == k){
ans = 0;
return ;
}
Q.push(node(n,0));
vis[n] = 1;
while(!Q.empty()){
node cur = Q.top() ; Q.pop() ;
if(!check(cur.x))
continue ;
if(cur.x + 1 == k || cur.x - 1 == k || cur.x * 2 == k){
ans = cur.dis + 1;
break;
}
if(check(cur.x + 1) && !vis[cur.x + 1])
Q.push(node(cur.x + 1 , cur.dis+1)),vis[cur.x + 1] = true;
if(check(cur.x - 1) && !vis[cur.x - 1])
Q.push(node(cur.x - 1 , cur.dis+1)),vis[cur.x - 1] = true;
if(check(cur.x * 2) && !vis[cur.x * 2])
Q.push(node(cur.x * 2 , cur.dis+1)),vis[cur.x * 2] = true;
}
return ;
}
int main(){
cin>>n>>k;
memset(vis , 0 , sizeof(vis));
bfs();
cout<<ans<<endl;
}