现在的位置: 首页 > 综合 > 正文

USACO SECTION 1.4 Mother’s Milk

2017年10月17日 ⁄ 综合 ⁄ 共 2596字 ⁄ 字号 评论关闭
文章目录

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: conicoc1
LANG: C
TASK: milk3
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int Queue[10000][3];
int front=0,rear=0;
int flag[100000];
int bucket[3],temp[3];  //记录状态
int A,B,C;   //记录容量 
int BC[100];

int comp(const void *a,const void *b)
{
	int *p1,*p2;
	p1=(int*)a;
	p2=(int*)b;
	
	return *p1-*p2;	
}

void AtoB()
{
	bucket[1]+=bucket[0];
	bucket[0]=0;
	if(bucket[1]>B)
	{
		bucket[0]=bucket[1]-B;
		bucket[1]=B;
	}
}

void AtoC()
{
	bucket[2]+=bucket[0];
	bucket[0]=0;
	if(bucket[2]>C)
	{
		bucket[0]=bucket[2]-C;
		bucket[2]=C;
	}
}

void BtoC()
{
	bucket[2]+=bucket[1];
	bucket[1]=0;
	if(bucket[2]>C)
	{
		bucket[1]=bucket[2]-C;
		bucket[2]=C;
	}
}

void BtoA()
{
	bucket[0]+=bucket[1];
	bucket[1]=0;
	if(bucket[0]>A)
	{
		bucket[1]=bucket[0]-A;
		bucket[0]=A;
	}
}

void CtoA()
{
	bucket[0]+=bucket[2];
	bucket[2]=0;
	if(bucket[0]>A)
	{
		bucket[2]=bucket[0]-A;
		bucket[0]=A;
	}
}

void CtoB()
{
	bucket[1]+=bucket[2];
	bucket[2]=0;
	if(bucket[1]>B)
	{
		bucket[2]=bucket[1]-B;
		bucket[1]=B;
	}
}

void act(int i)
{
	switch(i)
	{
		case 1:AtoB();break;
		case 2:AtoC();break;
		case 3:BtoA();break;
		case 4:BtoC();break;
		case 5:CtoA();break;
		case 6:CtoB();break;
	}		
}

void Enqueue()
{
	int i;
	for(i=0;i<3;i++)
	{
		Queue[rear][i]=bucket[i];		
	}
	rear++;
}

void Dequeue()
{
	int i;
	for(i=0;i<3;i++)
	{
		bucket[i]=Queue[front][i];
	}
	front++;
}


int main()
{
	FILE *fin,*fout;
	fin=fopen("milk3.in","r");
	fout=fopen("milk3.out","w");
	
	memset(flag,-1,sizeof(flag));
	
	fscanf(fin,"%d %d %d",&A,&B,&C);
	
	int i,j,k=0;
	
	bucket[0]=0;
	bucket[1]=0;
	bucket[2]=C;
	
	
	Enqueue();
	flag[bucket[0]+bucket[1]*21+bucket[2]*21*21]=1;
	
	while(front!=rear)
	{
		Dequeue();
		for(j=0;j<3;j++)
			temp[j]=bucket[j];
		
		for(i=1;i<=6;i++)
		{
			act(i);
			if(flag[bucket[0]+bucket[1]*21+bucket[2]*21*21]!=1)
			{
				Enqueue();
				flag[bucket[0]+bucket[1]*21+bucket[2]*21*21]=1;
			}
			for(j=0;j<3;j++)
				bucket[j]=temp[j];	
		}
		if(bucket[0]==0)
		{
			BC[k++]=bucket[2];
		}	
	}
	
	qsort(BC,k,sizeof(int),comp);
	
	for(i=0;i<k-1;i++)
		fprintf(fout,"%d ",BC[i]);
	
	fprintf(fout,"%d\n",BC[k-1]);
	
	return 0;
}

不知道算不算水题?

模拟了9个时钟转的那道的BFS

问题不大

抱歉!评论已关闭.