1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 #include <algorithm> 5 using namespace std; 6 struct node 7 { 8 int S,N,M; //三个杯子存在的可乐量 9 int count; 10 }; 11 int s,n,m; //三个杯子的容量 12 int res = -1; //初始化最后结果 13 int vis[500][500]; //访问标记 14 queue <node> q; //定义一个队列 15 void bfs() 16 { 17 memset(vis,0,sizeof(vis)); 18 node now; 19 q.push((node){s,0,0,0}); 20 vis[0][0] = 1; 21 while (!q.empty()) 22 { 23 now = q.front(); 24 //printf("%d %d %d %d\n",now.S,now.N,now.M,now.count); 25 if ( (now.S == s/2 && now.N == s/2) || (now.N == s/2 && now.M == s/2) || (now.M == s/2 && now.S == s/2) ) //如果已经评分 把值赋予给res 26 { 27 res = now.count; 28 while (!q.empty()) //清空队列 29 { 30 q.pop(); 31 } 32 return ; 33 } 34 q.pop(); 35 if (now.N < n) //如果第二杯子没有满 36 { 37 if (now.S >= n - now.N && !vis[n][now.M]) //如果第一个杯子可以装满第二个杯子 38 { 39 vis[n][now.M] = 1; 40 q.push((node){now.S - n + now.N, n , now.M , now.count+1}); 41 42 } 43 if ( now.S < n-now.N && !vis[now.N+now.S][now.M]) //如果第一个杯子中的量装不满第二个 44 { 45 vis[now.N+now.S][now.M] = 1; 46 q.push((node){0,now.N + now.S,now.M , now.count+1}); 47 } 48 if (now.M >= n - now.N && !vis[n][now.M - n + now.N]) //第三个杯子中的量可以装满第二个杯子 49 { 50 vis[n][now.M - n + now.N] = 1; 51 q.push((node){now.S,n,now.M - n + now.N,now.count+1}); 52 53 } 54 if ( now.M < n-now.N && !vis[now.N+now.M][0]) //第三个杯子中的量不可以装满第二个杯子 55 { 56 vis[now.N+now.M][0] = 1; 57 q.push((node){now.S , now.N + now.M , 0 ,now.count+1}); 58 } 59 } 60 if (now.M < m) //后面的情况类似 61 { 62 if (now.S >= m - now.M && !vis[now.N][m]) 63 { 64 vis[now.N][m] = 1; 65 q.push((node){now.S - m + now.M, now.N , m ,now.count+1}); 66 } 67 if ( now.S < m-now.M && !vis[now.N][now.M + now.S]) 68 { 69 vis[now.N][now.M + now.S] = 1; 70 q.push((node){0, now.N , now.M + now.S ,now.count+1}); 71 72 } 73 if (now.N >= m - now.M && !vis[now.N - m + now.M][m]) 74 { 75 vis[now.N - m + now.M][m] = 1; 76 q.push((node){now.S , now.N - m + now.M , m ,now.count+1}); 77 78 } 79 if ( now.N < m-now.M && !vis[0][now.M + now.N]) 80 { 81 vis[0][now.M + now.N] = 1; 82 q.push((node){now.S , 0 , now.N + now.M ,now.count+1}); 83 84 } 85 } 86 if (now.S < s) //因为第一个杯子最大,,所以不存在后面的某个杯子能装满 所以不用讨论 87 { 88 if ( now.N < s - now.S && !vis[0][now.M]) 89 { 90 vis[0][now.M] = 1; 91 q.push((node){now.S + now.N , 0 , now.M ,now.count+1}); 92 93 } 94 if ( now.M < s-now.S && !vis[now.N][0]) 95 { 96 vis[now.N][0] = 1; 97 q.push((node){now.S + now.M , now.N , 0 ,now.count+1}); 98 99 } 100 } 101 } 102 103 } 104 int main() 105 { 106 while (~scanf("%d%d%d",&s, &n, &m ) ) 107 { 108 res = -1; 109 if ( s == 0 && n == 0 && m == 0) 110 { 111 break; 112 } 113 if (s % 2 != 0 ) //如果总量是奇数,不可能被平分 114 { 115 printf("NO\n"); 116 continue; 117 } 118 bfs(); 119 if ( res == -1 ) 120 { 121 printf("NO\n"); 122 continue; 123 } 124 else 125 { 126 printf("%d\n",res); 127 } 128 } 129 return 0; 130 }
原文:http://www.cnblogs.com/hkhv/p/4970077.html