HDOJ 1495
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <queue> 7 #include <stack> 8 using namespace std; 9 struct node 10 { 11 int a,b,c,step; 12 }; 13 int n,m,s,vis[120][120][120],flag; 14 void bfs() 15 { 16 node s1,temp,next; 17 queue<node>q; 18 s1.a=s;s1.b=0;s1.c=0;s1.step=0; 19 vis[s][0][0]=1; 20 q.push(s1); 21 while(!q.empty()) 22 { 23 temp=q.front();q.pop(); 24 if(temp.a==temp.b&&temp.c==0||temp.a==temp.c&&temp.b==0||temp.b==temp.c&&temp.a==0) 25 { 26 printf("%d\n",temp.step); 27 flag=1; 28 return; 29 } 30 if(temp.a!=0&&temp.b<n)//s倒入n 31 { 32 if(n-temp.b>=temp.a) 33 { 34 next.a=0; 35 next.b=temp.a+temp.b; 36 } 37 else 38 { 39 next.a=temp.a-(n-temp.b); 40 next.b=n; 41 } 42 next.c=temp.c; 43 if(vis[next.a][next.b][next.c]==0) 44 { 45 next.step=temp.step+1; 46 vis[next.a][next.b][next.c]=1; 47 q.push(next); 48 } 49 } 50 if(temp.a!=0&&temp.c<m)//s倒入m 51 { 52 if(m-temp.c>=temp.a) 53 { 54 next.a=0; 55 next.c=temp.a+temp.c; 56 } 57 else 58 { 59 next.a=temp.a-(m-temp.c); 60 next.c=m; 61 } 62 next.b=temp.b; 63 if(vis[next.a][next.b][next.c]==0) 64 { 65 next.step=temp.step+1; 66 vis[next.a][next.b][next.c]=1; 67 q.push(next); 68 } 69 } 70 if(temp.b!=0&&temp.c<m)//n倒入m 71 { 72 if(m-temp.c>=temp.b) 73 { 74 next.b=0; 75 next.c=temp.b+temp.c; 76 } 77 else 78 { 79 next.b=temp.b-(m-temp.c); 80 next.c=m; 81 } 82 next.a=temp.a; 83 if(vis[next.a][next.b][next.c]==0) 84 { 85 next.step=temp.step+1; 86 vis[next.a][next.b][next.c]=1; 87 q.push(next); 88 } 89 } 90 if(temp.c!=0&&temp.b<n)//m倒入n 91 { 92 if(n-temp.b>=temp.c) 93 { 94 next.c=0; 95 next.b=temp.c+temp.b; 96 } 97 else 98 { 99 next.c=temp.c-(n-temp.b); 100 next.b=n; 101 } 102 next.a=temp.a; 103 if(vis[next.a][next.b][next.c]==0) 104 { 105 next.step=temp.step+1; 106 vis[next.a][next.b][next.c]=1; 107 q.push(next); 108 } 109 } 110 if(temp.b!=0&&temp.a!=s)//n倒入s 111 { 112 next.a=temp.a+temp.b; 113 next.b=0; 114 next.c=temp.c; 115 if(vis[next.a][next.b][next.c]==0) 116 { 117 next.step=temp.step+1; 118 vis[next.a][next.b][next.c]=1; 119 q.push(next); 120 } 121 } 122 if(temp.c!=0&&temp.a!=s)//m倒入s 123 { 124 next.a=temp.a+temp.c; 125 next.c=0; 126 next.b=temp.b; 127 if(vis[next.a][next.b][next.c]==0) 128 { 129 next.step=temp.step+1; 130 vis[next.a][next.b][next.c]=1; 131 q.push(next); 132 } 133 } 134 } 135 } 136 int main(int argc, char *argv[]) 137 { 138 while(scanf("%d%d%d",&s,&n,&m)!=EOF) 139 { 140 if(s==0&&n==0&&m==0) 141 break; 142 if(n+m<s||n+m>s||s%2==1) 143 { 144 printf("NO\n"); 145 continue; 146 } 147 memset(vis,0,sizeof(vis)); 148 flag=0; 149 bfs(); 150 if(!flag) 151 printf("NO\n"); 152 } 153 }