HDU 1495 非常可乐(BFS倒水问题)
Posted Yeader
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n",ans); 105 else 106 puts("NO"); 107 } 108 return 0; 109 }
以上是关于HDU 1495 非常可乐(BFS倒水问题)的主要内容,如果未能解决你的问题,请参考以下文章