codevs 3060 抓住那头奶牛 x
3060 抓住那头奶牛
USACO
时间限制: 1 s
空间限制: 16000 KB
题目等级 : 黄金 Gold
1 #include<cstdio> 2 #include<queue> 3 #define maxn 100001 4 5 using namespace std; 6 7 int n,k; 8 bool v[maxn]; 9 10 struct node 11 { 12 int pos,step; 13 }cur,nxt; 14 15 queue<node>q;//该队列是为了储存结构体中的pos,以及step 16 17 void Q_work() 18 { 19 cur.pos=n; 20 cur.step=0;//进行初始化 21 q.push(cur); 22 v[n]=true; 23 if(n==k) //特判如果起点与重点是重合的 24 { 25 printf("0"); 26 return; 27 } 28 while(!q.empty()) 29 { 30 cur=q.front(); 31 q.pop();//取出队头元素,将其出队 32 nxt.step=cur.step+1;//下一步一定是为当前的步数+1 33 for(int i=1;i<=3;i++) 34 { 35 switch(i)//枚举行走的三种情况 36 { 37 case 1 : nxt.pos=cur.pos+1; break; 38 case 2 : nxt.pos=cur.pos-1; break; 39 case 3 : nxt.pos=cur.pos*2; break; 40 } 41 if(nxt.pos>=0&&nxt.pos<=100000&&!v[nxt.pos]) 42 {//必须不超过边界并且当前并未走过 43 if(nxt.pos==k) 44 { 45 printf("%d",nxt.step);//如果==k则说明已经到达,则进行输出 46 return; 47 } 48 q.push(nxt);//将其入队 49 v[nxt.pos]=true;//并进行标记 50 } 51 } 52 } 53 } 54 55 int main() 56 { 57 scanf("%d%d",&n,&k); 58 Q_work(); 59 return 0; 60 }