zoukankan      html  css  js  c++  java
  • 92 母亲的牛奶

    92 母亲的牛奶

    作者: xxx时间限制: 1S章节: 宽度优先搜索

    问题描述 :

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

    输入说明 :

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

    输出说明 :

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

    输入范例 :
    8 9 10
    输出范例 :
    1 2 8 9 10

    #include <cstdio>
    #include <queue>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    struct node
    {
    	int x, y;
    }n;
    queue<node> que;
    int vis[25][25], m[3], tmp;
    
    void bfs()//广搜
    {
    	while (!que.empty())//队列不为空 循环
    	{
    		for (int i = 0; i < 3; i++)
    		{
    			for (int j = 0; j < 3; j++)
    			{
    				if (i == j) continue;
    				int A[3];
    				A[0] = que.front().x;
    				A[1] = que.front().y;
    				A[2] = m[2] - A[0] - A[1];//牛奶总量不变
    				tmp = A[i] + A[j];
    				A[j] = min(tmp, m[j]);
    				A[i] = tmp - A[j];
    				if (!vis[A[0]][A[1]])
    				{
    					vis[A[0]][A[1]] = 1;
    					n.x = A[0];
    					n.y = A[1];
    					que.push(n);
    				}
    			}
    		}
    		que.pop();
    	}
    }
    int main()
    {
    	for (int i = 0; i < 3; i++)
    		cin >> m[i];
    	vis[0][0] = 1;
    	n.x = 0;
    	n.y = 0;//初始化
    	que.push(n);//入队
    	bfs();
    	int c = 0;
    	for (int i = m[2]; i >= 0; i--)//输出
    	if (vis[0][i] == 1){
    		if (c == 1) printf(" ");
    		c = 1;
    		printf("%d", m[2] - i);
    	}
    	return 0;
    }
    
    #include <iostream>
    #include <algorithm>
    #include <set>
    using namespace std;
    int p[25][25][25] = { 0 };
    set<int> st;
    int a, b, c;
    void dfs(int na, int nb, int nc)
    {
    	if (p[na][nb][nc]) return;
    	if (na == 0) st.insert(nc);
    	p[na][nb][nc] = 1;
    
    	if (nc)
    	{
    		if (na < a) dfs(min(nc + na, a), nb, nc - (min(nc + na, a) - na));
    		if (nb < b) dfs(na, min(nb + nc, b), nc - (min(nb + nc, b) - nb));
    	}
    
    	if (nb)
    	{
    		if (na < a) dfs(min(na + nb, a), nb - (min(na + nb, a) - na), nc);
    		if (nc < c) dfs(na, nb - (min(nc + nb, c) - nc), min(nc + nb, c));
    	}
    
    	if (na)
    	{
    		if (nb < b) dfs(na - (min(na + nb, b) - nb), min(na + nb, b), nc);
    		if (nc < c) dfs(na - (min(na + nc, c) - nc), nb, min(nc + na, c));
    	}
    }
    int main()
    {
    	cin >> a >> b >> c;
    	dfs(0, 0, c);
    	for (set<int>::iterator it = st.begin(); it != st.end(); it++)
    	{
    		cout << *it << " ";
    	}
    	cout << endl;
    	return 0;
    }
    
    Yesterday is history,tomorrow ismystery,but today is a gift!That why it is called Present!
  • 相关阅读:
    一种可以实时检测IP地址合法性的EditText输入框
    LVDS 屏幕 M215HGE-L21 在 rk3288 上的适配过程
    轻读一下 Android 应用开发中的 assets 目录
    XML与其在Android下的解析
    Linux Shell脚本实现根据进程名杀死进程
    RSA host key has changed 错误
    Linux下安装jdk8步骤详述
    Windows/Linux javac/java编译运行引入所需的jar包
    No cached version of ..... available for offline mode.
    Java学习之InputStream中read()与read(byte[] b)
  • 原文地址:https://www.cnblogs.com/VictorierJwr/p/12878518.html
Copyright © 2011-2022 走看看