int i
void getti(int a,int y,int z)
int main()
{
int a,y,z
printf("input full a, empty b,c,get i:")
scanf("%d%d%d%d",&a,&y,&z,&i)
getti(a,y,z)
getti(a,y,z)
return 0
}
void getti(int a,int y,int z)
{
int b=0,c=0
printf("a%d b%d c%d\n%4d%4d%4d\n",a,y,z,a,b,c)
while(a!=i||(b!=i&&c!=i)) {
if(!b)
{ a-=yb=y }
else if(c==z)
{ a+=zc=0 }
else if(b>z-c)
{
b-=(z-c)c=z
}
else { c+=bb=0 }
printf("%4d%4d%4d\n",a,b,c)
}
}
5-->83 0 53-->50 3 5
8-->33 3 2
3-->51 5 2
5-->81 0 7
3-->50 1 7
8-->33 1 4
5-->34 0 4
给,详细的算法分析,以及源代码和注释:
问题分析与算法设计
将12品脱酒 8品脱和5品脱的空瓶平分,可以抽象为解不定方程:
8x-5y=6
其意义是:从12品脱的瓶中向8品脱的瓶中倒x次,并且将5品脱瓶中的酒向12品脱的瓶中倒y次,最后在12品脱的瓶
中剩余6品脱的酒。
用a,b,c代表12品脱、8品脱和5品脱的瓶子,求出不定方程的整数解,按照不定方程的意义则倒法为:
a ->b ->c ->a
x y
倒酒的规则如下:
1) 按a ->b ->c ->a的顺序;
2) b倒空后才能从a中取
3) c装满后才能向a中倒
按以上规则可以编写出程序如下:
*程序与程序注释
#include<stdio.h>
void getti(int a,int y,int z)
int i /*最后需要分出的重量*/
void main()
{
int a,y,z
printf("input Full a,Empty b,c,Get i:")/*a 满瓶的容量 y:第一个空瓶的容量 z:第二个空瓶的容量*/
scanf("%d,%d,%d,%d",&a,&y,&z,&i)
getti(a,y,z) /*按a ->y ->z ->a的 *** 作步骤*/
getti(a,z,y) /*按a ->z ->y ->a的步骤*/
}
void getti(int a,int y,int z) /*a:满瓶的容量 y:第一个空瓶的容量 z:第二个空瓶的容量*/
{
int b=0,c=0 /* b:第一瓶实际的重量 c:第二瓶实际的重量*/
printf(" a%d b%d c%d\n %4d%4d%4d\n",a,y,z,a,b,c)
while(a!=i||b!=i&&c!=i) /*当满瓶!=i或另两瓶都!=i*/
{
if(!b)
{ a-=yb=y}/*如果第一瓶为空,则将满瓶倒入第一瓶中*/
else if(c==z)
{ a+=zc=0}/*如果第二瓶满,则将第二瓶倒入满瓶中*/
else if(b>z-c)/*如果第一瓶的重量>第二瓶的剩余空间*/
{ b-=(z-c)c=z}/*则将装满第二瓶,第一瓶中保留剩余部分*/
else{ c+=bb=0} /*否则,将第一瓶全部倒入第二瓶中*/
printf(" %4d %4d %4d\n",a,b,c)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)