C:
农民要去抓牛。在一条笔直的路上,牛的位置为k,不动。农民从位置n出发,每次可以移动到位置n-1或n+1或2n,每次移动都花费1分钟,问抓到牛的最短时间
本来想用dp做,可是dp[i]=dp[i-1]+dp[i+1]+dp[2i]……由于dp[i+1]的存在,是倒推不了的
然后bfs一遍过
#include<stdio.h>
#include<queue>
using namespace std;
int vis[100005];
int main()
{
queue<int>q;
int n,k;
scanf("%d%d",&n,&k);
q.push(n);
while(!q.empty()){
int x=q.front();
q.pop();
if(x==k){
printf("%d",vis[x]);
break;
}
int nx;
nx=x-1;
if(nx>=0&&nx<=100000&&vis[nx]==0){
vis[nx]=vis[x]+1;
q.push(nx);
}
nx=x+1;
if(nx>=0&&nx<=100000&&vis[nx]==0){
vis[nx]=vis[x]+1;
q.push(nx);
}
nx=x*2;
if(nx>=0&&nx<=100000&&vis[nx]==0){
vis[nx]=vis[x]+1;
q.push(nx);
}
}
return 0;
}