学号:2009115020322
倒酒问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
问题描述:
有2个八两的酒瓶,装满了酒,只有一个三两的酒杯。问如何倒酒才能让四个人平均分到这十六两酒,即每人喝四两。用C语言编写。看了网上很少有人写过这个程序,即便是写过,也不是计算机智能完成的,倒像是自己先知道怎么倒酒了,然后模拟计算机完成自己的步骤。实现代码:
#include
#define MAXSTEP 100
int index = 0;
typedef struct LNode{
int x;
int y;
int v;
int a[4];
int step;
}LNode;
LNode p;
int xy(void)
{
int temp;
if(p.y == 8||p.x == 8)return 0;
else if(p.x + p.y > 8){
temp = p.y;
p.y = 8;
p.x -= 8 - temp;
return 1;
}
else{
p.y += p.x;
p.x = 0;
return 1;
}
}
int xv(void)
{
int temp;
if(p.v == 3)return 0;
else if(p.x + p.v > 3){
temp = p.v;
p.v = 3;
p.x -= 3 - temp;
return 1;
}
else{
p.v += p.x;
p.x = 0;
return 1;
}
}
int yx(void)
{
int temp;
if(p.x == 8 || p.y == 8)return 0;
else if(p.y + p.x > 8){
temp = p.x;
p.x = 8;
p.y -= 8 - temp;
return 1;
}
else{
p.x += p.y;
p.y = 0;
return 1;
}
}
int yv(void)
{
int temp;
if(p.v == 3)return 0;
else if(p.y + p.v > 3){
temp = p.v;
p.v = 3;
p.y -= 3 - temp;
return 1;
}
else{
p.v += p.y;
p.y = 0;
return 1;
}
}
int vx(void)
{
int temp;
if(p.x == 8)return 0;
else if(p.v + p.x > 8){
temp = p.x;
p.x = 8;
p.v -= 8 - temp;
return 1;
}
else{
p.x += p.v;
p.v = 0;
return 1;
}
}
int vy(void)
{
int temp;
if(p.y == 8)return 0;
else if(p.v + p.y > 8){
temp = p.y;
p.y = 8;
p.v -= 8 - temp;
return 1;
}
else{
p.y += p.v;
p.v = 0;
return 1;
}
}
int assign()
{
int min, i;
i = 0;
min = (!p.y||(p.v < p.y && p.v != 0))? p.v : p.y;
min = (!min||(p.x < min && p.x != 0))? p.x : min;
if(min > 4||min == 0)return 0;
while(p.a[i]!=0 && i < 4)i++;
if (i < 4){
p.a[i] = min;
if(p.v == min)
p.v = 0;
else if(p.y == min)
p.y = 0;
else p.x =0;
return 1;
}
else {
i = 0;
while (min + p.a[i] != 4 && i < 4)
i++;
if(i < 4){
p.a[i] = 4;
if(p.v == min)
p.v = 0;
else if(p.y == min)
p.y = 0;
else p.x =0;
return 1;
}
else{
i = 0;
while (min + p.a[i] > 4 && i < 4)
i++;
if( i < 4){
p.a[i] += min;
if(p.v == min)
p.v = 0;
else if(p.y == min)
p.y = 0;
else p.x =0;
return 1;
}
else
return 0;
}
}
}
void initial(LNode l[])
{
l[0].x = l[0].y = 8;
l[0].v =0;
int i;
for(i = 0; i < 4; i++)
l[0].a[i] = 0;
l[0].step = '0';
}
void addnode(LNode l[])
{
int i;
++index;
l[index].x = p.x;
l[index].y = p.y;
l[index].v = p.v;
for(i = 0;i < 4; i++)
l[index].a[i] = p.a[i];
l[index].step = '0';
}
int search(LNode l[])
{
int i;
for(i = 0; i <= index; ++i)
{
if(p.v==l[i].v)
if(p.x==l[i].x&&p.y==l[i].y||p.y==l[i].x&&p.x==l[i].y)
return 0;
}
return 1;
}
void back(LNode l[])
{
while((l[index].step += 1) > '6')
--index;
}
void readdata(LNode l[])
{
int i;
p.x = l[index].x;
p.y = l[index].y;
p.v = l[index].v;
for(i = 0;i < 4; i++)
p.a[i] = l[index].a[i];
p.step = l[index].step;
}
int next(void)
{
int ok;
switch(p.step){
case'0':
ok = assign();
break;
case'1':
ok = xv();
break;
case'2':
ok = yv();
break;
case'3':
ok = vx();
break;
case'4':
ok = vy();
break;
case'5':
ok = xy();
break;
case'6':
ok = yx();
break;
}
return ok;
}
void main()
{
int i,j;
LNode list[MAXSTEP];
initial(list);
readdata(list);
while(!(p.x==0&&p.y==0&&p.v==0))
{
readdata(list);
if(next()&&search(list))
addnode(list);
else
back(list);
}
for(i = 0; i <=index; ++i)
{
printf("%d %d %d\t",list[i].x,list[i].y,list[i].v);
for(j = 0; j < 4; ++j)
printf("%d ",list[i].a[j]);
printf("\n");
}
}
更多问题请搜2009115020322