HDU1495 非常可乐 BFS

题意:

小明买了一瓶可乐,容量为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 }
View Code

 

原文地址:https://www.cnblogs.com/-maybe/p/4376924.html