题意:
小明买了一瓶可乐,容量为S,小明有2个杯子,容量分别为N,M,现在小明要把可乐分成体积相等的2部分,问需要几个步骤。
S,N,M都是整数。
1.若S为奇数,明显不可以.
2.若S为偶数,进行BFS.
vis数组,记录哪些状态出现过。
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=101; 7 bool vis[maxn][maxn][maxn]; 8 int S,N,M; 9 struct Edge 10 { 11 int s,n,m,num; 12 }; 13 bool judge(int s,int n,int m) 14 { 15 if(s==S/2&&n==S/2) 16 return true; 17 else if(s==S/2&&m==S/2) 18 return true; 19 else if(n==S/2&&m==S/2) 20 return true; 21 return false; 22 } 23 int bfs(int s) 24 { 25 memset(vis,false,sizeof(vis)); 26 queue<Edge>que; 27 while(!que.empty()) 28 que.pop(); 29 Edge eee; 30 eee.s=s; 31 eee.n=0; 32 eee.m=0; 33 eee.num=0; 34 que.push(eee); 35 vis[s][0][0]=true; 36 Edge cnt; 37 while(!que.empty()){ 38 Edge u=que.front(); 39 que.pop(); 40 if(judge(u.s,u.n,u.m)) 41 return u.num; 42 cnt.s=u.s-min(u.s,N-u.n); 43 cnt.n=u.n+min(u.s,N-u.n); 44 cnt.m=u.m; 45 cnt.num=u.num+1; 46 if(!vis[cnt.s][cnt.n][cnt.m]){ 47 vis[cnt.s][cnt.n][cnt.m]=true; 48 que.push(cnt); 49 } 50 cnt.s=u.s-min(u.s,M-u.m); 51 cnt.n=u.n; 52 cnt.m=u.m+min(u.s,M-u.m); 53 if(!vis[cnt.s][cnt.n][cnt.m]){ 54 vis[cnt.s][cnt.n][cnt.m]=true; 55 que.push(cnt); 56 } 57 if(u.n+u.s<=S){ 58 cnt.s=u.n+u.s; 59 cnt.n=0; 60 cnt.m=u.m; 61 if(!vis[cnt.s][cnt.n][cnt.m]){ 62 vis[cnt.s][cnt.n][cnt.m]=true; 63 que.push(cnt); 64 } 65 } 66 if(u.n+u.s>S){ 67 cnt.s=S; 68 cnt.n=u.n+u.s-S; 69 cnt.m=u.m; 70 if(!vis[cnt.s][cnt.n][cnt.m]){ 71 vis[cnt.s][cnt.n][cnt.m]=true; 72 que.push(cnt); 73 } 74 } 75 if(u.n+u.m<=M){ 76 cnt.s=u.s; 77 cnt.n=0; 78 cnt.m=u.n+u.m; 79 if(!vis[cnt.s][cnt.n][cnt.m]){ 80 vis[cnt.s][cnt.n][cnt.m]=true; 81 que.push(cnt); 82 } 83 } 84 if(u.n+u.m>M){ 85 cnt.s=u.s; 86 cnt.n=u.n+u.m-M; 87 cnt.m=M; 88 if(!vis[cnt.s][cnt.n][cnt.m]){ 89 vis[cnt.s][cnt.n][cnt.m]=true; 90 que.push(cnt); 91 } 92 } 93 if(u.m+u.s<=S){ 94 cnt.s=u.m+u.s; 95 cnt.m=0; 96 cnt.n=u.n; 97 if(!vis[cnt.s][cnt.n][cnt.m]){ 98 vis[cnt.s][cnt.n][cnt.m]=true; 99 que.push(cnt); 100 } 101 } 102 if(u.m+u.s>S){ 103 cnt.s=S; 104 cnt.m=u.m+u.s-S; 105 cnt.n=u.n; 106 if(!vis[cnt.s][cnt.n][cnt.m]){ 107 vis[cnt.s][cnt.n][cnt.m]=true; 108 que.push(cnt); 109 } 110 } 111 if(u.n+u.m<=N){ 112 cnt.s=u.s; 113 cnt.m=0; 114 cnt.n=u.n+u.m; 115 if(!vis[cnt.s][cnt.n][cnt.m]){ 116 vis[cnt.s][cnt.n][cnt.m]=true; 117 que.push(cnt); 118 } 119 } 120 if(u.n+u.m>N){ 121 cnt.s=u.s; 122 cnt.m=u.m+u.n-N; 123 cnt.n=N; 124 if(!vis[cnt.s][cnt.n][cnt.m]){ 125 vis[cnt.s][cnt.n][cnt.m]=true; 126 que.push(cnt); 127 } 128 } 129 130 } 131 return -1; 132 } 133 int main() 134 { 135 while(scanf("%d%d%d",&S,&N,&M)) 136 { 137 if(S==0) 138 break; 139 if(S%2) 140 printf("NO "); 141 else{ 142 int num=bfs(S); 143 if(num==-1) 144 printf("NO "); 145 else 146 printf("%d ",num); 147 } 148 } 149 return 0; 150 }