比较简单的搜索,不过我的内存开得太大了,不知道怎么缩减
一开始内存开得太小了,忘了可能有一步是X*2,所以总数值可能大于100000,所以RE了
#include<iostream> #include<string> #include<queue> using namespace std; int n,k; int vis[200002]; struct node { int x,cnt; node(int _x=0,int _cnt=0):x(_x),cnt(_cnt){}; }; queue<node> Q; void bfs() { memset(vis,0,sizeof(vis)); node f; f.x=n;f.cnt=0; while(!Q.empty()) Q.pop(); Q.push(f); vis[f.x]=1; while(!Q.empty()) { node t=Q.front(); Q.pop(); if(t.x==k) { cout<<t.cnt<<endl; return; } if(t.x>k&&!vis[t.x-1])//若t.x>k,则不可能在加1或者乘以2 { Q.push(node(t.x-1,t.cnt+1)); vis[t.x-1]=1; continue; } if(t.x*3<=2*k)//原形是这样的,t.x*2-k<=k-t.x { if(!vis[t.x*2]) { Q.push(node(t.x*2,t.cnt+1)); vis[t.x*2]=1; } } if(!vis[t.x-1]) {Q.push(node(t.x-1,t.cnt+1)); vis[t.x-1]=1;} if(!vis[t.x+1]) {vis[t.x+1]=1; Q.push(node(t.x+1,t.cnt+1));} } } int main() { while(cin>>n>>k) { if(n>k) { cout<<n-k<<endl;continue;} bfs(); } return 0; }