您的位置:首页 > 其它

1.4 milk3 倒牛奶

2010-11-08 13:12 267 查看
广度优先搜索,用数组记录到达过的状态

Mother's Milk

Farmer John has three milking buckets of capacity A, B, and C liters. Each of the numbers A, B, and C is an integer from 1 through 20, inclusive. Initially, buckets A and B are empty while bucket C is full of milk. Sometimes, FJ pours milk from one bucket to another until the second bucket is filled or the first bucket is empty. Once begun, a pour must be completed, of course. Being thrifty, no milk may be tossed out.

Write a program to help FJ determine what amounts of milk he can leave in bucket C when he begins with three buckets as above, pours milk among the buckets for a while, and then notes that bucket A is empty.

PROGRAM NAME: milk3

INPUT FORMAT

A single line with the three integers A, B, and C.

SAMPLE INPUT (file milk3.in)

8 9 10

OUTPUT FORMAT

A single line with a sorted list of all the possible amounts of milk that can be in bucket C when bucket A is empty.

SAMPLE OUTPUT (file milk3.out)

1 2 8 9 10

SAMPLE INPUT (file milk3.in)

2 5 10

SAMPLE OUTPUT (file milk3.out)

5 6 7 8 9 10

/*
ID: xdzhbin1
LANG: C++
TASK: milk3
*/
#include <fstream>
using namespace std;
int A,B,C;	//三个杯子的容量
int min(int n1, int n2) //返回两个数中较小的一个
{
return n1>n2 ? n2 : n1;
}

void pull(int a, int b, int c, bool m[][21][21], bool cup[21])
{
if(a==0) cup[c] = true;	//a为空时,记录c中的牛奶量
int vol;
if(a>0&&b<B)	//A向B倒
{
vol = min(a,B-b);	//能倒的牛奶量
if(!m[a-vol][b+vol][c])	//未到过倒完之后的状态
{
m[a-vol][b+vol][c] = true;	//记录这个状态
pull(a-vol,b+vol,c,m,cup);	//从这个状态开始,广搜,倒牛奶
}
}
if(a>0&&c<C)	//A向C倒
{
vol = min(a,C-c);
if(!m[a-vol][b][c+vol])
{
m[a-vol][b][c+vol] = true;
pull(a-vol,b,c+vol,m,cup);
}
}
if(b>0&&a<A)	//B向A倒
{
vol = min(b,A-a);
if(!m[a+vol][b-vol][c])
{
m[a+vol][b-vol][c] = true;
pull(a+vol,b-vol,c,m,cup);
}
}
if(b>0&&c<C)	//B向C倒
{
vol = min(b,C-c);
if(!m[a][b-vol][c+vol])
{
m[a][b-vol][c+vol] = true;
pull(a,b-vol,c+vol,m,cup);
}
}
if(c>0&&a<A)	//C向A倒
{
vol = min(c,A-a);
if(!m[a+vol][b][c-vol])
{
m[a+vol][b][c-vol] = true;
pull(a+vol,b,c-vol,m,cup);
}
}
if(c>0&&b<B)	//C向B倒
{
vol = min(c,B-b);
if(!m[a][b+vol][c-vol])
{
m[a][b+vol][c-vol] = true;
pull(a,b+vol,c-vol,m,cup);
}
}
}
int main()
{
ifstream in("milk3.in",ios::in);
ofstream out("milk3.out",ios::out);
bool milks[21][21][21];	//记录状态是否到达过,如milks[0][0][0]表示三个杯子中的牛奶都为零的状态
bool ccup[21];	//输出结果,也就是A空时,C中的牛奶量
int i,j,k;
//初始化状态信息
for(i=0; i<21; i++)
for(j=0; j<21; j++)
for(k=0; k<21; k++)
milks[i][j][k] = false;
for(i=0; i<21; i++)
ccup[i] = false;
in>>A>>B>>C;	//读入容量
int c = C;		//C中的牛奶量
milks[0][0][c] = true;
ccup[c] = true;
pull(0,0,c,milks,ccup);
bool space = false;
for(i=0; i<21; i++)
{
if(ccup[i])
{
if(space) out<<" ";
out<<i;
space = true;
}
}
out<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: