三个水杯

判断一个数是否为整数: if(a==int(a))

描述给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态最少次数。

 
输入
第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出
每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
样例输入
2
6 3 1
4 1 1
9 3 2
7 1 1
样例输出
3
-1

第一:输出N for循环输出三个水杯a[0],b[0],d[0] 开到50// 或者用a[]记录输出结果
第二:前提:V1=E1+E2+E3 (根据这个等式 V1已知 如果E2 和 E3 能满足 E1必能求出)!!!!
V3的最终状态只能是满的或者空的
V2的最终状态是满的或V3的倍数或空的(满本身也是V3的倍数)//但是满的时候考虑方法不同
///////////V1的最终状态是满的或空的或!!!!!!!错误的思想
正确的思想:只要满足上述情况 V1必能达到最终状态!!!!
第三 E3为0 E2为0 0次
    E3为0  E2是V3的倍数 V1到给V3一次V3到给V2的倍数次  倍数+1 次!!!!!错误 比如  5 3 2 与2 3 0 只要一次
正确: V2/V3不为整数时 算出倍数n1 从V1到V3到V2 要2×n1次
V2/V3是整数时 算出倍数n2=(V2-E2)/V3 从V1到V2到V3 要2n2 +1 与2n1比较

E3==V3 E2=0 1次
E3=V3 E2是V3的倍数 V1给V3一次 V3倒给V2倍数次 V1再倒给V3一次 倍数+2次//错误
正确
误解:两种方向既能从V3倒给V2 也能从V2倒满后倒给V3  事物的双向性
特例

# include<stdio.h>
int main()
{
int N,i,n1,n2,t,a[50]={0};
int V1,V2,V3,E1,E2,E3;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d %d %d",&V1,&V2,&V3);
scanf("%d %d %d",&E1,&E2,&E3);
if(V1==E1+E2+E3)
{
if(E3==0 && E2==0)
{
a[i]=0;
}
else if(E3==V3 && E2==0)
{
a[i]=1;
}
else if(E3==0 && E2*1.0/V3 == int(E2*1.0/V3))
{
if(V2*1.0/V3==int(V2*1.0/V3))
{
n1= E2/V3; n2= (V2-E2)/V3
if(n1>n2)
{t=n1;n1=n2;n2=t;}
a[i]=n1;
}
else
{
a[i]=E2*1.0/V3 +1;
}
}
else if(E3 ==V3 && E2*1.0/V3 == int(E2*1.0/V3))
{

if(V2*1.0/V3==int(V2*1.0/V3))
{
n1= E2/V3; n2= (V2-E2)/V3
if(n1>n2)
{t=n1;n1=n2;n2=t;}
a[i]=n1;
}
else
{
a[i]=E2*1.0/V3 +2;
}

}

else
{
a[i]=-1;
}
}
else
a[i]=-1;
}
for(i=0;i<N;i++)
{
printf("%d ",a[i]);
}
return 0;
}

 
原文地址:https://www.cnblogs.com/wshyj/p/6025156.html