标签:
抓住那头牛(POJ3278)
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上
,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)
。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要
花多少时间才能抓住牛?
广度优先搜索算法如下:(用QUEUE)
(1) 把初始节点S0放入Open表中;
(2) 如果Open表为空,则问题无解,失败
退出;
(3) 把Open表的第一个节点取出放入
Closed表,并记该节点为n;
(4) 考察节点n是否为目标节点。若是,
则得到问题的解,成功退出;
(5) 若节点n不可扩展,则转第(2)步;
(6) 扩展节点n,将其不在Closed表和
Open表中的子节点(判重)放入Open表的尾部
,并为每一个子节点设置指向父节点的指针(
或记录节点的层次),然后转第(2)步。
1 #include<iostream> 2 #include<queue> 3 #include<string> 4 using namespace std; 5 #define MAX 100000 6 struct Step 7 { 8 int xx;//位置 9 int steps;//到这一位置所需要走过的步数. 10 Step(int aa,int bb):xx(aa),steps(bb){} 11 }; 12 13 int flaged[MAX+10];// 14 15 queue<Step> opend; 16 17 int main() 18 { 19 int N; 20 int K; 21 cout<<"please input N"<<endl; 22 cin>>N; 23 cout<<"please input K"<<endl; 24 cin>>K; 25 memset(flaged,0,sizeof(flaged)); 26 opend.push(Step(N,0)); 27 flaged[N]=1; 28 Step S=opend.front(); 29 while(!opend.empty()) 30 { 31 S=opend.front(); 32 if(S.xx==K) 33 { 34 cout<<"find the caw ,we need "<<S.steps<<" steps"<<endl; 35 system("pause"); 36 return 0; 37 } 38 39 if(S.xx-1>=0&&flaged[S.xx-1]!=1) 40 { 41 opend.push(Step((S.xx-1),(S.steps+1))); 42 flaged[S.xx-1]=0; 43 } 44 if(S.xx+1<=MAX&&flaged[S.xx+1]!=1) 45 { 46 opend.push(Step((S.xx+1),(S.steps+1))); 47 flaged[S.xx+1]=0; 48 } 49 if((S.xx)*2<=MAX&&flaged[(S.xx)*2]!=1) 50 { 51 opend.push(Step((S.xx*2),(S.steps+1))); 52 flaged[S.xx*2]=0; 53 } 54 opend.pop(); 55 } 56 system("pause"); 57 return 0; 58 59 }
标签:
原文地址:http://www.cnblogs.com/yanliang12138/p/4230924.html