您的位置:首页 > 其它

计蒜客 难题题库 031 无脑博士的试管们

2015-08-10 09:19 232 查看
390次
9.48%
1000ms
65536K

无脑博士有三个容量分别是A,B,C升的试管,A,B,C分别是三个从1到20的整数,最初,A和B试管都是空的,而C试管是装满硫酸铜溶液的。有时,无脑博士把硫酸铜溶液从一个试管倒到另一个试管中,直到被灌试管装满或原试管空了。当然每一次灌注都是完全的。由于无脑博士天天这么折腾,早已熟练,溶液在倒的过程中不会有丢失。
写一个程序去帮助无脑博士找出当A是个是空的时候,C试管中硫酸铜溶液所剩量的所有可能性。
输入包括一行,为空格分隔开的三个数,分别为整数A,B和C。
输出包括一行,升序地列出当A试管是空的时候,C试管溶液所剩量的所有可能性。

样例1

输入:
2 5 10


输出:
5 6 7 8 9 10


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<algorithm>

using namespace std;

int A, B, C;
bool vis[25][25][25];

struct node{
int a,b,c;
}pre,nxt;

queue<node>Q;

void solve(){

pre.a = 0, pre.b = 0, pre.c = C;
while( !Q.empty() ) Q.pop();
Q.push( pre );
vis[0][0][C] = true;
while( !Q.empty() ){
pre = Q.front(); Q.pop();

int a = pre.a, b = pre.b, c = pre.c;
if( a > 0 ){
if( b < B ){
nxt.a = a-min(a,(B-b));
nxt.b = b+min(a,(B-b));
nxt.c = c;
if( !vis[nxt.a][nxt.b][nxt.c] )
Q.push( nxt ), vis[nxt.a][nxt.b][nxt.c] = true;
}
if( c < C ){
nxt.a = a-min(a,(C-c));
nxt.b = b;
nxt.c = c+min(a,(C-c));
if( !vis[nxt.a][nxt.b][nxt.c] )
Q.push( nxt ), vis[nxt.a][nxt.b][nxt.c] = true;
}
}
if( b > 0 ){
if( a < A ){
nxt.a = a+min(b,(A-a));
nxt.b = b-min(b,(A-a));
nxt.c = c;
if( !vis[nxt.a][nxt.b][nxt.c] )
Q.push( nxt ), vis[nxt.a][nxt.b][nxt.c] = true;
}
if( c < C ){
nxt.a = a;
nxt.b = b-min(b,(C-c));
nxt.c = c+min(b,(C-c));
if( !vis[nxt.a][nxt.b][nxt.c] )
Q.push( nxt ), vis[nxt.a][nxt.b][nxt.c] = true;
}
}
if( c > 0 ){
if( a < A ){
nxt.a = a+min(c,(A-a));
nxt.b = b;
nxt.c = c-min(c,(A-a));
if( !vis[nxt.a][nxt.b][nxt.c] )
Q.push( nxt ), vis[nxt.a][nxt.b][nxt.c] = true;
}
if( b < B ){
nxt.a = a;
nxt.b = b+min(c,(B-b));
nxt.c = c-min(c,(B-b));
if( !vis[nxt.a][nxt.b][nxt.c] )
Q.push( nxt ), vis[nxt.a][nxt.b][nxt.c] = true;
}
}
}
}
int main(){
while( scanf("%d%d%d",&A,&B,&C) != EOF){
memset( vis, 0, sizeof(vis) );
solve();
bool tmp[25];
memset(tmp,0,sizeof(tmp));
for(int b = 0; b <= B; b++)
for(int c = 0; c <= C; c++)
tmp[c] |= vis[0][b][c];
bool flag = false;
for(int i = 0; i <= C; i++)
if( tmp[i] ){
if( !flag ) printf("%d",i), flag =true;
else printf(" %d",i);
}
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: