至此第1.4关通关。
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.
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.
状态空间很有限,每个桶最多有21种状态(包括桶为空),最坏情况下总状态数为213,直接进行DFS深度优先搜索,当状态重复时剪枝,这样就遍历了三个桶所有可能的状态。DFS一般递归实现,注意不要在递归函数中过度使用全局变量(由于我使用全局变量用于循环控制,出现了问题,详情请看代码注释)。
点击以查看我的程序源码:
/* ID: ******* LANG: C++ TASK: milk3 */ #include<stdio.h> #include<stdlib.h> bool hash[21][21][21]; int cap[3];//记录容量 FILE *fin,*fout; int cc[21];//记录结果 bool hashCc[21];//用于结果去重 int tailCc; int cmpint(const void *a, const void *b){ return(*(int *)a-*(int *)b); //升序 } void dfs(int st[3]){//st[0] st[1] st[2] 分别代表A B C桶的状态 if(hash[st[0]][st[1]][st[2]])return;//判断该状态是否扩展过 hash[st[0]][st[1]][st[2]]=true; if(st[0]==0&&!hashCc[st[2]]){ hashCc[st[2]]=true; cc[++tailCc]=st[2]; } int tt[3]; int i,j;//如果i,j为全局变量,将出现逻辑错误!这种错误很隐蔽,要注意避免在递归函数中滥用全局变量。 for(i=0;i<3;i++) for(j=0;j<3;j++){//枚举各种倾倒 if(i==j)continue; tt[0]=st[0]; tt[1]=st[1]; tt[2]=st[2]; if(tt[i]+tt[j]>cap[j]){ tt[i]=tt[i]+tt[j]-cap[j]; tt[j]=cap[j]; } else{ tt[j]+=tt[i]; tt[i]=0; } dfs(tt); } return; } int main(){ int i,j,k; fin=fopen("milk3.in","r"); fout=fopen("milk3.out","w"); fscanf(fin,"%d %d %d",&cap[0],&cap[1],&cap[2]); for(i=0;i<21;i++) for(j=0;j<21;j++) for(k=0;k<21;k++) hash[i][j][k]=false; for(i=0;i<21;i++) hashCc[i]=false; tailCc=-1; int st[3]; st[0]=st[1]=0; st[2]=cap[2]; dfs(st); qsort(cc,tailCc+1,sizeof(int),cmpint); fprintf(fout,"%d",cc[0]); for(i=1;i<=tailCc;i++) fprintf(fout," %d",cc[i]); fprintf(fout,"\n"); return 0; }
2024年1月16日 10:10
This is really likewise an incredibly beneficial placing most of us severely encountered shopping as a result of. It truly is faraway from each and every day we have now possibility to think about something