首页 > 代码库 > POJ 3278 Catch That Cow
POJ 3278 Catch That Cow
题意:Farmer John在一条线上追牛,他位于N,牛位于K。每一分钟从当前位置X他有两种方式追:移动到X-1或X+1;移到2X。问追到牛花费的最小时间。
分析:算最短时间用宽度搜索。将Farmer John的每一分钟的移动看做一次状态的变换,每一状态包含他的当前位置坐标和到当前位置花费的时间。移动分为三个相似代码段,每次将所有能由当前位置到达的位置全部加入队列。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 #include <queue> 6 #include <cmath> 7 #include <stack> 8 #include <set> 9 #include <map> 10 #include <algorithm> 11 using namespace std; 12 #define ll long long 13 #define inf 0x3f3f3f3f 14 int n,k; 15 bool v[100001]; 16 struct node 17 { 18 int e,t; 19 }; 20 int bfs() 21 { 22 int i,j; 23 node a,b; 24 queue<node> q; 25 a.e=n,a.t=0; 26 v[n]=1; 27 q.push(a); 28 while(!q.empty()) 29 { 30 b=q.front(); 31 q.pop(); 32 if(b.e==k) return b.t; 33 a.e=b.e+1; 34 if(a.e>=0&&a.e<=100000&&!v[a.e]) 35 { 36 a.t=b.t+1; 37 v[a.e]=1; 38 q.push(a); 39 } 40 a.e=b.e-1; 41 if(a.e>=0&&a.e<=100000&&!v[a.e]) 42 { 43 a.t=b.t+1; 44 v[a.e]=1; 45 q.push(a); 46 } 47 a.e=b.e*2; 48 if(a.e>=0&&a.e<=100000&&!v[a.e]) 49 { 50 a.t=b.t+1; 51 v[a.e]=1; 52 q.push(a); 53 } 54 } 55 return -1;//根据题意一定可以追到,但是不加此句会WA,应该是OJ的问题 56 } 57 int main() 58 { 59 int i,j; 60 while(~scanf("%d %d",&n,&k)) 61 { 62 if(n>=k)//如果起始位置坐标大于牛的坐标则只能靠X-1一种操作追到 63 printf("%d\n",n-k); 64 else 65 { 66 memset(v,0,sizeof v); 67 printf("%d\n",bfs()); 68 } 69 } 70 return 0; 71 }
POJ 3278 Catch That Cow
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。