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!