这是我的第一片解题报告,写的不好的,还望大家指出
zoj1005对于很多人来说是水题目,但是对我来说还是要思考好一会才能做出来的
下面是我的思路,首先那些操作步骤已经定了的,就那么7种,为了省点打字功夫,我存了一个字符串数组
然后就做题目,刚开始只考虑了4种情况,提交后过不了,然后想了很久,找不到原因,之后尝试转化为数学问题,发现了很多情况下有解的,我没有考虑到,而只考虑了集中特殊情况,这个其实有点像扩展欧几里得的,若a,b容量互质,则必有解,所以前四种情况不足以涵盖所有有解情况
后来加了情况5,提交上去可以通过,现在又发现,其实情况5已经包含了情况2,3,4的。代码如下
#include<stdio.h>
int main()
{
int ca,cb,n,i,sum;
char s[7][20]={"fill A","fill B","empty A","empty B","pour A B","pour B A","success"};
while(scanf("%d %d %d",&ca,&cb,&n)!=EOF)
{
if(cb==n)/*情况1*/
printf("%s\n",s[1]);
else if(n%ca==0)/*2*/
for(i=n/ca;i>0;i--)
printf("%s\n%s\n",s[0],s[4]);
else if((ca*(cb/ca+1))%cb==n%ca)/*3*/
{
for(i=(cb/ca+1);i>0;i--)
printf("%s\n%s\n",s[0],s[4]);
printf("%s\n%s\n",s[3],s[4]);
for(i=n/ca;i>0;i--)
printf("%s\n%s\n",s[0],s[4]);
}
else if((cb-n)%ca==0)/*4*/
{
printf("%s\n",s[1]);
for(i=(cb-n)/ca;i>0;i--)
printf("%s\n",s[5]);
}
else/*5*/
{
sum=0;
while(sum!=n)
{
sum=sum+ca;
printf("%s\n%s\n",s[0],s[4]);
if(sum>cb)
{
sum=sum-cb;
printf("%s\n%s\n",s[3],s[4]);
}
}
}
printf("%s\n",s[6]);
}
return 0;
}