http://poj.org/problem?id=3278
从n出发,向两边转移,为了不使数字无限制扩大,限制在2*k以内,
注意不能限制在k以内,否则就缺少不断使用-1得到的一些结果
#include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int maxn=2e5+3; int n,k; int dp[maxn]; queue<int>que; int main(){ scanf("%d%d",&n,&k); memset(dp,0x7f,sizeof(dp)); dp[n]=0; que.push(n); bool fl=false; while(!que.empty()){ int f=que.front();que.pop(); if(f==k){printf("%d ",dp[f]);break;} if(f-1>=0&&dp[f-1]>dp[f]+1){ que.push(f-1); dp[f-1]=dp[f]+1; } if(f+1<=2*k&&dp[f+1]>dp[f]+1){ que.push(f+1); dp[f+1]=dp[f]+1; } if(f<k&&dp[2*f]>dp[f]+1){ que.push(2*f); dp[2*f]=dp[f]+1; } } return 0; }