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;
}
posted @ 2020-05-12 20:47  RabbitJwr  阅读(203)  评论(0编辑  收藏  举报