10603 - Fill
来源:互联网 发布:python怎么安装离线库 编辑:程序博客网 时间:2024/06/08 15:36
描述:倒水问题,模拟+深搜/广搜就可以了#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <queue>using namespace std;struct jugs{ int num[3]; int value;};int count,d,flag,n,m,pre[3];bool visit[211][211][211];queue<jugs> v;void bfs(){ while(!v.empty()) v.pop(); jugs p; memset(visit,false,sizeof(visit)); p.num[0]=p.num[1]=p.value=flag=count=n=m=0; p.num[2]=pre[2]; visit[0][0][pre[2]] = true; v.push(p); while(!v.empty()) { p=v.front(); v.pop(); for(int i = 0; i < 3; i++) { if(p.num[i]==d) { if(!flag||(flag&&count>p.value)) count=p.value; flag=1; break; } if(!flag&&p.num[i]<d) { if(n<p.num[i]) { n=p.num[i]; m=p.value; } else if(n==p.num[i]&&m>p.value) m=p.value; } if(p.num[i]!=pre[i]) for(int j = 0; j < 3; j++) if(i != j&&p.num[j]) { jugs q = p; int c=min(pre[i]-p.num[i],q.num[j]); q.num[i]+=c; q.num[j]-=c; q.value+=c; if(!visit[q.num[0]][q.num[1]][q.num[2]]) { visit[q.num[0]][q.num[1]][q.num[2]] = true; v.push(q); } } } }}int main(){#ifndef ONLINE_JUDGE freopen("a.txt","r",stdin);#endif int t; scanf("%d", &t); while(t--) { scanf("%d%d%d%d", &pre[0], &pre[1], &pre[2], &d); bfs(); if(flag) printf("%d %d\n", count, d); else printf("%d %d\n", m, n); } return 0;}