母亲的牛奶(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;
}

时间: 2024-11-03 21:08:03

母亲的牛奶(milk) (BFS)的相关文章

母亲的牛奶(milk)

母亲的牛奶(milk) 题目描述 农民约翰有三个容量分别是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

洛谷 P1215 [USACO1.4]母亲的牛奶 Mother&#39;s Milk

题目描述 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了.当然每一次灌注都是完全的.由于节约,牛奶不会有丢失. 写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. 输入输出格式 输入格式: 单独的一行包括三个整数A,B和C. 输出格式: 只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性. 输入输出样例 输入样例#1:

luogu P1215 [USACO1.4]母亲的牛奶 Mother&#39;s Milk

题目描述 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了.当然每一次灌注都是完全的.由于节约,牛奶不会有丢失. 写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. 输入输出格式 输入格式: 单独的一行包括三个整数A,B和C. 输出格式: 只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性. 输入输出样例 输入样例#1:

[USACO1.4]母亲的牛奶 Mother&#39;s Milk

题目 题目描述 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了.当然每一次灌注都是完全的.由于节约,牛奶不会有丢失. 写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. 输入输出格式 输入格式: 单独的一行包括三个整数A,B和C. 输出格式: 只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性. 输入输出样例 输入样例

$P1215 [USACO1.4]母亲的牛奶 Mother&#39;s Milk$

\(problem\) 搜索 找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. 显然 我们需要一个数组来判重 表示这种状态出现过没有. 然而 储存答案. 需要一个桶?或者sort咯 不过多个cnt 我咧懒得打. 所以我们用一个\(vis[N][N][N] ;\) 来判重 表示这种状态出现过没有 出现过就直接返回. 然后用一个ans数组来储存答案\(ans[N] ;\) 都是布尔型的就行. 然后进入程序片段. 一共三个字母 则倒法有 \(3!=1*2*3=6\). 那就手工模拟好了.不用循环了

【USACO 1.4.4】母亲的牛奶

[题目描述] 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了.当然每一次灌注都是完全的.由于节约,牛奶不会有丢失. 写一个程序去帮助约翰找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. [格式] INPUT FORMAT: (file milk3.in) 单独的一行包括三个整数A,B和C. OUTPUT FORMAT: (file milk3.out

luogu P2744 [USACO5.3]量取牛奶Milk Measuring

题目描述 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位——译者注) 他的最好的牛奶,并把它装入一个大瓶子中卖出.消费者要多少,他就给多少,从不有任何误差. 农夫约翰总是很节约.他现在在奶牛五金商店购买一些桶,用来从他的巨大的牛奶池中量出 Q 夸脱的牛奶.每个桶的价格一样.你的任务是计算出一个农夫约翰可以购买的最少的桶的集合,使得能够刚好用这些桶量出 Q 夸脱的牛奶.另外,由于农夫约翰必须把这些桶搬回家,对于给出的两个极小桶集合,他会选择“更小的”一个

[USACO5.3]量取牛奶Milk Measuring

https://daniu.luogu.org/problemnew/show/P2744 滚动数组压去第一维:前i种木桶 f[j] 量取体积j最少需要几种木桶 g[j]  体积j的最优解是否使用了第i种木桶 f[j]= f[j-a[i]] +  g[j-a[i]]^1 输出方案时用搜索,DP检验 g[j] 表示用当前搜索的木桶方案,能否量取体积j g[j]|=g[j-a[i]] 先对木桶按大小排一次序 搜索的时候从前往后选,第一个合法的方案满足字典序最小 #include<cstdio> #

UPC-1526 母亲的牛奶【搜索】

题目描述 农民约翰有三个容量分别是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 可能的倒