193
作者:
xmh
,
2022-01-20 20:12:40
,
所有人可见
,
阅读 216
#include<bits/stdc++.h>
using namespace std;
int n,ans=10000;
struct Node{
int step,a,b;
int f(void){
int sum=0;
int t=a;
while(t<n){
t=t<<1;
sum++;
}
return sum;
}
friend bool operator < (Node a1,Node a2)
{
return a1.step+a1.f() > a2.step+a2.f();
}
};
int gcd(int a,int b){
return b>0 ? gcd(b,a%b):a;
}
int num;
int bfs(int n){
priority_queue<Node>heap;
Node start;
start.step=0;start.a=1;start.b=0;
map<pair<int,int>,int>st;
heap.push(start);
while(heap.size()){
auto u=heap.top();
heap.pop();
if(u.a==n||u.b==n){
return u.step;
}
pair<int,int> z;
z.first=u.a;z.second=u.b;
int t=st.count(z);
if(t){if(st[z]>u.step)st[z]=u.step;else continue;}
else st[z]=u.step;
for(int i=0;i<4;i++){
for(int j=0;j<2;j++){
int nx;
if(i==0)nx=2*u.a;
if(i==1)nx=u.a+u.b;
if(i==2)nx=2*u.b;
if(i==3)nx=u.a-u.b;
Node p;
p.step=u.step+1;
p.a=u.a;
p.b=u.b;
if(j==0)p.a=nx;
else p.b=nx;
int maxt=max(p.a,p.b),mint=min(p.a,p.b);
p.a=maxt;p.b=mint;
if(p.a==p.b)continue;
if(p.a>0&&p.b==0)continue;
if(n%gcd(p.a,p.b)!=0)continue;
heap.push(p);
}
}
}
return -1;
}
int main(){
cin>>n;
cout<<bfs(n)<<endl;
}
重载运算符,优先队列的排序速度比较快,也可能是排序结构体包含元素较少