http://ff781778304.blog.163.com/blog/static/191291033201191611332761/
/*
*POJ-3414 倒水问题
*提交状态:AC
*思路:题目的意思是选出最快的倒水方案
*要以一个固定的方向倒水,假设从b到a,则有以下几种情况:
1、如果b是空的,则加满
2、如果a中不是满的,则用b中的水尽量将其填满
3、如果a是满的,则将其倒空
*/
#include<cstdio>
int a,b,c;
bool run(char s[][10],int &i,char proc[][10])
{
int la=0,lb=0,t=1;
while(t<1000) //用此条件限制总的步骤数,如果超过了,则说明不能解决问题
{
if(lb==c||la==c) break; //如果找到了一种倒水方案,则退出
if(lb==0)
{
lb=b;
sprintf(s[i++],proc[0]);
}
else if(la<a) //a中不满的情况
{
sprintf(s[i++],proc[1]); //sprintf函数用法:将字符串proc[1]打印到s[i-1]中去
int temp=a-la;
if(lb>=temp) //如果b中的水足够将a加满,则加满
{
la=a;
lb-=temp;
}
else //否则,将b全部倒入a中
{
la+=lb;
lb=0;
}
}
else if(la==a) //如果a中是满的,则倒空
{
la=0;
sprintf(s[i++],proc[2]);
}
t++;
}
if(t>=1000)
return true;
return false;
}
int main()
{
scanf("%d%d%d",&a,&b,&c);
char sr[10000][10];
char fr[1000][10];
char procs[][10]={"FILL(2)","POUR(2,1)","DROP(1)"}; //存储从两个不同方向倒水的方式
char procf[][10]={"FILL(1)","POUR(1,2)","DROP(2)"};
int lens=0;
int lenf=0;
bool tag1=run(sr,lens,procs);
bool tag2=run(fr,lenf,procf);
if(tag1&&tag2) //如果两种情况下都不能倒出指定水量,则无解
{
printf("impossible\n");
return 0;
}
int i;
if(lens>=lenf) //否则输出最快的那个方法
{
printf("%d\n",lenf);
for(i=0;i<lenf;i++)
printf("%s\n",fr[i]);
}
else
{
printf("%d\n",lens);
for(i=0;i<lens;i++)
printf("%s\n",sr[i]);
}
return 0;
}