标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2717
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12615 Accepted Submission(s):
3902
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <stack> 6 #include <queue> 7 using namespace std; 8 int f[200020]; //记录步数 9 void bfs(int n,int k) 10 { 11 int a[3]; //位置数组 12 memset(f,0,sizeof(f)); 13 queue <int > q; 14 q.push(n); 15 f[q.front()] = 1; 16 if (n == k) 17 return ; 18 while (!q.empty()) 19 { 20 int t = q.front(); 21 int x = f[t]; 22 a[0] = t-1; //三个位置 23 a[1] = t+1; 24 a[2] = t*2; 25 for (int i = 0; i < 3; i ++) 26 { 27 if (a[i] >= 0 && a[i] < 200001 && f[a[i]]==0) //注意这里的边界值 28 { 29 q.push(a[i]); 30 f[a[i]] = x+1; //在上一步的基础上加1 31 } 32 if (a[i] == k) 33 return ; 34 } 35 q.pop(); 36 } 37 } 38 int main () 39 { 40 int i; 41 int n,k; 42 while (~scanf("%d%d",&n,&k)) 43 { 44 dfs(n,k); 45 printf("%d\n",f[k]-1); //减去农夫本来在的位置那一步 46 } 47 return 0; 48 }
标签:
原文地址:http://www.cnblogs.com/yoke/p/5929546.html