HDU 1495 非常可乐(BFS倒水问题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495

题目大意:只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。如果能将可乐平分则输出倒可乐的最少的次数,如果不能输出"NO"。

解题思路:题意很坑看了半天,就是要有两个杯子里的可乐都为S/2,S为奇数肯定不能平分的,接下来就模拟倒水(有六个选择)进行BFS,然后用数组记录各杯子里水的量作为状态。

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<queue>
  4 using namespace std;
  5 const int N=105;
  6 int A,B,C,ans;
  7 int vis[N][N][N];
  8 
  9 struct node{
 10     int a,b,c,step;
 11 }pre,now;
 12 
 13 bool bfs(){
 14     queue<node>q;
 15     now.a=A;
 16     now.b=0;
 17     now.c=0;
 18     now.step=0;
 19     vis[A][0][0]=1;
 20     q.push(now);
 21     while(!q.empty()){
 22         pre=q.front();
 23         q.pop();
 24         for(int i=1;i<=6;i++){
 25             int a,b,c;
 26             a=pre.a;
 27             b=pre.b;
 28             c=pre.c;
 29             if(i==1){
 30                 if(a>B-b){
 31                     a-=(B-b);
 32                     b=B;
 33                 }
 34                 else{
 35                     b+=a;
 36                     a=0;    
 37                 }
 38             }
 39             if(i==2){
 40                 a+=b;
 41                 b=0;    
 42             }
 43             if(i==3){
 44                 if(b>C-c){
 45                     b-=(C-c);
 46                     c=C;
 47                 }
 48                 else{
 49                     c+=b;
 50                     b=0;        
 51                 }
 52             }
 53             if(i==4){
 54                 if(c>B-b){
 55                     c-=(B-b);
 56                     b=B;
 57                 }
 58                 else{
 59                     b+=c;
 60                     c=0;
 61                 }
 62             }
 63             if(i==5){
 64                 if(a>C-c){
 65                     a-=(C-c);
 66                     c=C;
 67                 }
 68                 else{
 69                     c+=a;
 70                     a=0;
 71                 }
 72             }
 73             if(i==6){
 74                 a+=c;
 75                 c=0;
 76             }
 77             if(vis[a][b][c])
 78                 continue;
 79             if(b==a&&b==A/2||a==c&&a==A/2){
 80                 ans=pre.step+1;
 81                 return true;
 82             }
 83             vis[a][b][c]=1;
 84             now.a=a;
 85             now.b=b;
 86             now.c=c;
 87             now.step=pre.step+1;
 88             q.push(now);
 89         }
 90     }
 91     return false;
 92 }
 93 
 94 
 95 int main(){
 96     while(~scanf("%d%d%d",&A,&B,&C)){
 97         memset(vis,0,sizeof(vis));
 98         ans=0;
 99         if(A==0&&B==0&&C==0)    
100             break;
101         if(A&1)
102             puts("NO");
103         else if(bfs())
104             printf("%d
",ans);
105         else
106             puts("NO");
107     }
108     return 0;
109 }
原文地址:https://www.cnblogs.com/fu3638/p/7523901.html