poj 3414(简单bfs)

题目链接:http://poj.org/problem?id=3414

思路:bfs简单应用,增对瓶A或者瓶B进行分析就可以了,一共6种状态。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<queue>
  6 using namespace std;
  7 
  8 struct Node{
  9     int a,b,step;
 10     char str[111][111];
 11 };
 12 
 13 int A,B,C;
 14 bool mark[111][111];
 15 bool bfs()
 16 {
 17     memset(mark,false,sizeof(mark));
 18     queue<Node>que;
 19     Node p,q;
 20     p.a=0,p.b=0,p.step=0;
 21     que.push(p);
 22     mark[0][0]=true;
 23     while(!que.empty()){
 24         p=que.front();
 25         que.pop();
 26         if(p.a==C||p.b==C){
 27             printf("%d\n",p.step);
 28             for(int i=1;i<=p.step;i++){
 29                 printf("%s\n",p.str[i]);
 30             }
 31             return true;
 32         }
 33         if(p.a==0){
 34             q=p;
 35             q.a=A;
 36             q.step++;
 37             strcpy(q.str[q.step],"FILL(1)");
 38             if(!mark[q.a][q.b]){
 39                 mark[q.a][q.b]=true;
 40                 que.push(q);
 41             }
 42         }else if(p.a<=A){
 43             q=p;
 44             q.a=0;
 45             q.step++;
 46             strcpy(q.str[q.step],"DROP(1)");
 47             if(!mark[q.a][q.b]){
 48                 mark[q.a][q.b]=true;
 49                 que.push(q);
 50             }
 51             if(p.b<B){
 52                 q=p;
 53                 if(q.a+q.b<=B){
 54                     q.b+=q.a;
 55                     q.a=0;
 56                 }else {
 57                     q.a=(q.b+q.a)-B;
 58                     q.b=B;
 59                 }
 60                 q.step++;
 61                 strcpy(q.str[q.step],"POUR(1,2)");
 62                 if(!mark[q.a][q.b]){
 63                     mark[q.a][q.b]=true;
 64                     que.push(q);
 65                 }
 66             }
 67         }
 68         if(p.b==0){
 69             q=p;
 70             q.b=B;
 71             q.step++;
 72             strcpy(q.str[q.step],"FILL(2)");
 73             if(!mark[q.a][q.b]){
 74                 mark[q.a][q.b]=true;
 75                 que.push(q);
 76             }
 77         }else if(p.b<=B){
 78             q=p;
 79             q.b=0;
 80             q.step++;
 81             strcpy(q.str[q.step],"DROP(2)");
 82             if(!mark[q.a][q.b]){
 83                 mark[q.a][q.b]=true;
 84                 que.push(q);
 85             }
 86             if(p.a<A){
 87                 q=p;
 88                 if(q.b+q.a<=A){
 89                     q.a+=q.b;
 90                     q.b=0;
 91                 }else {
 92                     q.b=(q.b+q.a)-A;
 93                     q.a=A;
 94                 }
 95                 q.step++;
 96                 strcpy(q.str[q.step],"POUR(2,1)");
 97                 if(!mark[q.a][q.b]){
 98                     mark[q.a][q.b]=true;
 99                     que.push(q);
100                 }
101             }
102         }
103     }
104     return false;
105 }
106 
107 
108 int main()
109 {
110     while(~scanf("%d%d%d",&A,&B,&C)){
111         if(!bfs())puts("impossible");
112     }
113     return 0;
114 }
View Code

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值