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;}

原创粉丝点击