zoukankan      html  css  js  c++  java
  • 母亲的牛奶(milk) (BFS)

    问题 A: 母亲的牛奶(milk)

    时间限制: 1 Sec  内存限制: 64 MB
    提交: 14  解决: 8
    [提交][状态][讨论版]

    题目描述

    农民约翰有三个容量分别是A、B、C升的桶,A、B、C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的。有时,约翰把牛奶从一 个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的,由于节约,牛奶不会丢失。写一个程序去帮助约翰找出当A桶是空的时候,C桶中 牛奶所剩量的所有可能性。

    输入

    单独的1行,包括三个整数A,B和C。

    输出

    只有1行,列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。

    样例输入

    8 9 10
    

    样例输出

    1 2 8 9 10
    
    【分析】用一个结构体存三个桶的状态,然后暴力BFS,最后用set存一下结果。
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <time.h>
    #include <string>
    #include <map>
    #include <stack>
    #include <vector>
    #include <set>
    #include <queue>
    #define inf 0x3f3f3f3f
    #define mod 1000000007
    typedef long long ll;
    using namespace std;
    const int N=100010;
    int n;
    int w[21][21];
    int g[3];
    int a,b,c;
    set<int>p;
    struct man {
        int x,y,z;
    };
    void bfs(int aa,int bb,int cc) {
        w[aa][bb]=1;
        queue<man>q;
        man s;
        s.x=0;
        s.y=0;
        s.z=cc;
        q.push(s);
        while(!q.empty()) {
            man t=q.front();
            q.pop();
            if(t.x==0)p.insert(t.z);
            int f[3];
    
            for(int i=0; i<3; i++) {
            f[0]=t.x;f[1]=t.y; f[2]=t.z;
                    if(f[i]==0)continue;
                for(int j=0; j<3; j++) {
                     f[0]=t.x; f[1]=t.y; f[2]=t.z;
                    man k;
                    if(i==j||f[j]==g[j])continue;
                    if(f[i]+f[j]>=g[j]) {
                        f[i]=f[i]-(g[j]-f[j]);
                        f[j]=g[j];
                    } else if(f[i]+f[j]<g[j]) {
                         f[j]+=f[i];
                        f[i]=0;
                    }
                    k.x=f[0];
                    k.y=f[1];
                    k.z=f[2];
                    if(w[k.x][k.y]==0) {
                        q.push(k);
                        w[k.x][k.y]=1;
                    }
                }
            }
        }
    }
    
    int main() {
        memset(w,0,sizeof(w));
        cin>>a>>b>>c;
        g[0]=a;
        g[1]=b;
        g[2]=c;
        bfs(a,b,c);
        int r[25],mm=0;
       for(set<int>::iterator it=p.begin();it!=p.end();it++)
       {
           r[mm++]=*it;
       }
       sort(r,r+mm);cout<<r[0];
       for(int i=1;i<mm;i++)cout<<" "<<r[i];cout<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    深入Log4J源码之Log4J Core
    ScheduledThreadPoolExecutor与System#nanoTime
    []JSR 133 (Java Memory Model) FAQ
    happens-before俗解
    ScheduledThreadPoolExecutor实现原理
    Java Timer&TimerTask原理分析
    Java 编程的动态性,第 1 部分: 类和类装入
    结合反射与 XML 实现 Java 编程的动态性
    Java 日志缓存机制的实现
    Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/5719842.html
Copyright © 2011-2022 走看看