从n到m,有-1和*2两种操作。问最少走几步。
这题必须从m来逆向考虑。
#include <>bits/stdc++.h>
using namespace std;
int main(){
int count =0;
int m,n;
cin>>n>>m;
while(n < m){
if(m%2)
m++;
else
m/=2;
count++;
}
cout<<count+n-m<<endl;
}
另一题:从n到m,有-1和+1和*2三种操作。问最少走几步。
后来想了想记忆化搜索真的是行不通的,会重复取状态。
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <cstdio>
#include <map>
#include <set>
#include<queue>
using namespace std;
int vis[200005];
queue<pair<int,int> > q;
int main(){
int n,m;
cin>>n>>m;
int s=0;
q.push(make_pair(n,0));
while(!q.empty()){
int fr=q.front().first;
int p=q.front().second;
q.pop();
if(fr>200000||fr<0) continue;
if(vis[fr]==1) continue;
vis[fr]=1;
if(fr==m){
s=p;
break;
}
q.push(make_pair(fr-1,p+1));
q.push(make_pair(fr+1,p+1));
q.push(make_pair(fr*2,p+1));
}
cout<<s<<endl;
}