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\n");

141         else{

142             int num=bfs(S);

143             if(num==-1)

144                 printf("NO\n");

145             else

146                 printf("%d\n",num);

147         }

148     }

149     return 0;

150 }
View Code

 

 

你可能感兴趣的:(HDU)