c语言 《过河》

人、狮子、兔子、大白菜从河一边到河另一边,人每次只带一物,如何过河?
用C语言编程
我没有骗分,实在是不懂啊,
这号也是刚申请的
帮帮忙呀!用C语言编出程序
这是编程问题啊!

先带兔子过河,再回来,再带狮子过河,顺便把兔子带回来,再把白菜带过河,然后回来再把兔子带过去,就OK了

这个主要是人不在的时候,狮子会吃兔子,兔子会出白菜,但狮子肯定不会吃白菜是不,就根据这个想不就是了

简单的逻辑问题,我只说算法,你定义两个数组,数组一代表河这边的东西,数组二代表河那边的东西(其中加入一个空白东西,也就是不带东西的选择),循环带数组1中的东西,每次过河带东西之后,判断两个数组中是否有吃与被吃的关系(这个定义成一个函数),然后就是回来,回来的时候循环带数组2中的东西,判断两个数组中是否有吃与被吃的关系,这样循环下去,直到河这边的东西为空的时候就完了
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-04-10
是不是在骗分啊?
相同的问题。
第2个回答  2008-04-13
这个问题不简单呀,是个数学模型上的问题,可以把这个问题扩展到几百个元素。

你得让我想想

想起来了。注释写在了后面,主要思想是设置了两个数组。left[3]表示没过河的集合,right[3]表示已经过河的集合。0,1,2分别表示白菜,兔子,狮子,-2表示空(比如白菜过河了那么left[0]就等于-2)。输出结果中用x to left 和x to right表示元素的运动方向。
程序如下:
#include <stdio.h>
#include <math.h>
int kong(int left[])
//判断是否全都过河了,0表示没全过河,1表示全过河了
{int i;
for(i=0;i<3;i++)
{if(left[i]!=-2)
return 0;
}
return 1;
}
int ltor(int left[],int right[])
//到对岸时选一个元素
{int i,a;
for(i=0;i<3;i++)
if(left[i]!=-2)
{if(abs(left[(i+1)%3]-left[(i+2)%3])!=1)
//此句中如果两数相减有绝对值为一的元素情况说明有吃与被吃的关系存在,即不能运该元素
{right[i]=left[i];
left[i]=-2;
printf("%d to right\n",i);
}
}
}
int rtol(int left[],int right[])
//从对岸回去时选一个元素
{int i;
for(i=0;i<3;i++)
if(abs(right[(i+1)%3]-right[(i+2)%3])==1)
//如果有两数之差有绝对值为一的情况,说明人必须带回一个元素回去,不然有吃东西会被吃掉
{left[(i+1)%3]=right[(i+1)%3];
right[(i+1)%3]=-2;
printf("%d to left\n",i+1);
}
}
void main()
{int left[3]={0,1,2},right[4]={-2,-2,-2};
while(!kong(left))
{ltor(left,right);
if(!kong(left))
rtol(left,right);
}
}
相似回答
大家正在搜