一种方法是BFS。以N为根,每个点有三个子节点。因为每条边的权值都是1,所以第一次广度搜索到K的时间就是答案。
另一种解法是最短路。求N到K的单源最短路即可。
//93ms 2.9MB #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <string> using namespace std; const int maxn=1e5+100; int d[maxn]; bool vis[maxn]; int N,K; void spfa() { memset(d,0x3f,sizeof(d)); memset(vis,false,sizeof(vis)); vis[N]=true; d[N]=0; queue<int> que; que.push(N); while(!que.empty()) { int u=que.front();que.pop(); vis[u]=false;///没有负环的话,vis可以不要 int v; for(int i=0;i<3;i++) { if(i==0) v=u+1; else if(i==1) v=u-1; else v=u*2; if(v<0 || v>=maxn) continue; if(d[v]>d[u]+1) { d[v]=d[u]+1; if(!vis[v]) { vis[v]=true; que.push(v); } } } } printf("%d\n",d[K]); } int main() { while(~scanf("%d%d",&N,&K)) { spfa(); } return 0; }