1. 程式人生 > >HDU 1495 非常可樂(BFS倒水問題)

HDU 1495 非常可樂(BFS倒水問題)

非常可樂 std push pre con scanf col break memset

題目鏈接: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倒水問題)