三个水杯

判断一个数是否为整数: 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\n",a[i]);
}
return 0;
}

 
时间: 2024-10-25 06:04:49

三个水杯的相关文章

NYOJ21 三个水杯 (经典问题 bfs)

题目描述: http://acm.nyist.net/JudgeOnline/problem.php?pid=21 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数. 输入 第一行一个整数N(0<N<50)表示N组测试数据 接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100

nyist_21(三个水杯)(BFS)

描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数. 输入 第一行一个整数N(0<N<50)表示N组测试数据 接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积. 第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们

nyoj三个水杯(bfs)

三个水杯 时间限制:1000 ms  |           内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数. 输入 第一行一个整数N(0<N<50)表示N组测试数据接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>

nyoj 21 三个水杯

三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数. 输入 第一行一个整数N(0<N<50)表示N组测试数据接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的

Nyoj 21 三个水杯(bfs)

三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数. 输入 第一行一个整数N(0<N<50)表示N组测试数据接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的

NYOJ 21 三个水杯 【暴力+BFS】

题意:不解释. 策略:广搜. 解释一下为什么会是广搜,一个水杯只能向其他两个水杯倒水,不能向他自己倒水,这样一共有三个水杯也就是有6种情况,只需要一步一步的搜索就好了(数据没多大 <100), 我们将每一次出现的水杯中的水数(就是有多少水)都标记下来,如果是以前没有出现过,那么就进队列,同时将此时的水杯数标记下来,说明该种情况已出现,一直找到想要找的状态为止,如果都找不到,就返回-1. 难点:我在下面的代码中会有详细的解释. ps:网上有说这道题是隐式图,因为BFS原来是来搜索图的,我比较认可.

三个水杯(BFS)

三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 给出三个水杯.大小不一,而且仅仅有最大的水杯的水是装满的.其余两个为空杯子.三个水杯之间相互倒水,而且水杯没有标识,仅仅能依据给出的水杯体积来计算.如今要求你写出一个程序.使其输出使初始状态到达目标状态的最少次数. 输入 第一行一个整数N(0<N<50)表示N组測试数据 接下来每组測试数据有两行.第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示

队列,广搜 nyoj 21 三个水杯

三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数. 输入 第一行一个整数N(0<N<50)表示N组测试数据 接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯

BFS [NYOJ 21] 三个水杯

三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数. 输入 第一行一个整数N(0<N<50)表示N组测试数据接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的