• UVA 10603 Fill


    题意:

      题目的意思是倒水,给出的四个数据是第一个水杯,第二个水杯,第三个水杯,和目标水量。一开始只有第三个水杯是满的,剩下的水杯是空的。倒水的时候只能把倒水出来的这个杯子倒空,或是倒水进去的杯子倒满。 问最少转移多少水量,使三个杯子中(其中一个)出现目标水量。如果无法出现目标水量,就目标水量减一,还无法出现再减一。

    分析:

      bfs不需要退出条件,应该搜到所要状态都访问过为止。每得出一个新状态了,这时候这个状态下达到这三种水量的总倒水量,就是这个状态的里面累加上来的倒水量,如果小于之前记录的达到这三种水量的最小倒水量,就替换,当然如果这个水量是没有出现过的,就直接替换。到最后我们得到一个ans数组(前面说到的达到某种水量的最小倒水量)。初始目标水量是d那我们就先看ans[d] 如果是-1 ,说明从没出现过那就ans[d-1]直到出现不是-1的,就把最小倒水量值输出来,也把下标(这时的目标水量):

    代码:

      
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <queue>
    using namespace std;
    struct node
    {
    int v[3];
    int dist;
    bool operator <(const node& a) const
    {
    return dist>a.dist;
    }
    };
    const int maxn=205;
    int vis[maxn][maxn],cap[3],ans[maxn];
    void solve(int a,int b,int c,int d)
    {
    memset(vis,0,sizeof(vis));
    memset(ans,-1,sizeof(ans));
    cap[0]=a;
    cap[1]=b;
    cap[2]=c;
    priority_queue<node>q;
    node start;
    start.v[0]=start.v[1]=0;
    start.v[2]=c;
    start.dist=0;
    q.push(start);
    vis[0][0]=1;
    while(!q.empty())
    {
            node u=q.top();
    q.pop();
    int i,j,k;
    for(i=0;i<3;i++)
    {
    int d1=u.v[i];
    if(ans[d1]<0||u.dist<ans[d1])
    ans[d1]=u.dist;
    //cout<<ans[d]<<endl;
    }
            if(ans[d]>=0)
    break;
    for(i=0;i<3;i++)
    {
    for(j=0;j<3;j++)
    {
    if(i!=j)
    {
    //cout<<ans[d]<<endl;
    if(u.v[i]==0||u.v[j]==cap[j])
    continue;
    int amount=min(cap[j],u.v[i]+u.v[j])-u.v[j];
    node u2;
    memcpy(&u2,&u,sizeof(u));
    u2.dist=u.dist+amount;
    u2.v[i]-=amount;
    u2.v[j]+=amount;
    if(!vis[u2.v[0]][u2.v[1]])
    {
    vis[u2.v[0]][u2.v[1]]=1;
    q.push(u2);
    }
    }
    }
    }
    }
    while(d>=0)
    {
    //cout<<ans[d]<<endl;
    if(ans[d]>=0)
    {
    printf("%d %d ",ans[d],d);
    return;
    }
    d--;
    }
    }
    int main()
    {
    int t;
    scanf("%d",&t);
    while(t--)
    {
    int a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    solve(a,b,c,d);
    }
    }
  • 相关阅读:
    【原创】go语言学习(十六)接口
    【原创】go语言学习(十五)IO操作2
    【原创】go语言学习(十四)IO操作1
    【原创】go语言学习(十三)struct介绍2
    【原创】go语言学习(十二)struct介绍1
    【原创】go语言学习(十一)package简介
    【原创】sed正则表达式替换
    【原创】go语言学习(十)Map类型
    【原创】go语言学习(九)指针类型
    【原创】go语言学习(八)切片
  • 原文地址:https://www.cnblogs.com/137033036-wjl/p/4869522.html
Copyright © 2020-2023  润新知