Description
在一个数轴上开始农夫在位置N,奶牛在位置K,奶牛的位置不动,农夫每次有三种选择:
1,向左走一步,花费1秒 2,向右走一步,花费一秒 3,走到2*n的位置,花费一秒
问农夫最少花多长时间找到奶牛。
Input
N和K
Output
最短的时间
题解:是一道bfs的入门题,注意只有向左走一步才能往左走,注意添加if(k<n)printf("%d ",n-k);的剪枝。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #define maxn 1000005 7 8 using namespace std; 9 10 int step[maxn],n,k; 11 bool vis[maxn]; 12 queue <int> q; 13 14 inline void bfs(int pos) 15 { 16 step[pos]=0; 17 vis[pos]=true; 18 q.push(pos); 19 while(!q.empty()) 20 { 21 int p=q.front(); q.pop(); 22 for(register int i=1;i<=3;++i) 23 { 24 int nxt; 25 if(i==1) nxt=p+1; 26 else if(i==2) nxt=p-1; 27 else if(i==3) nxt=p*2; 28 if(nxt<0||nxt>=maxn) continue; 29 if(!vis[nxt]) 30 { 31 step[nxt]=step[p]+1; 32 vis[nxt]=true; 33 q.push(nxt); 34 } 35 if(nxt==k) return; 36 } 37 } 38 return; 39 } 40 41 int main() 42 { 43 while(!q.empty()) q.pop(); 44 scanf("%d%d",&n,&k); 45 if(n>=k) 46 { 47 printf("%d ",n-k); 48 return 0; 49 } 50 bfs(n); 51 printf("%d ",step[k]); 52 return 0; 53 }