主题:用C语言编写“农夫过河问题”
74521rgb
[专家分:0] 发布于 2004-05-12 17:58:00
农夫过河。一个农夫带着一只狼,一只羊和一些菜过河。河边只有一条一船,由
于船太小,只能装下农夫和他的一样东西。在无人看管的情况下,狼要吃羊,羊
要吃菜,请问农夫如何才能使三样东西平安过河。
回复列表 (共20个回复)
11 楼
beggarson [专家分:330] 发布于 2004-07-07 18:38:00
设三个变量,用个递归不就得了。
12 楼
雨中叶落 [专家分:860] 发布于 2004-07-07 19:07:00
我记得以前就有类似的帖子了
有一家子过河,外加两个强盗什么的
翻翻前面的帖子
13 楼
databoy [专家分:310] 发布于 2004-07-08 15:27:00
/* 数字大小表示过河顺序的先后,数字大的先过*/
main()
{
int lang,yang,cao;
for(lang=3;lang>=1;lang--)
for(yang=3;lang>=1;lang--)
if(yang!=lang)
for(cao=3;cao>=1;caop--)
if(cao!=yang && cao!=lang)
if(yang>lang && yang>cao)
printf("lang--%d yang--%d cao--%d",lang,yang,cao);
}
14 楼
混混兔 [专家分:1600] 发布于 2004-07-08 17:23:00
这实际上一个图论中的路径问题
假定状态节点a1(狼,羊,菜),状态节点a2(狼,羊),状态节点a3(羊,菜),状态节点a4(狼,菜),状态节点a5(狼),状态节点a6(羊),状态节点a7(菜),状态节点a8为空
取这些节点意思是说,无论你怎么运,原来岸上的上一定是上面几种节点状态中的一种
从路径来说,如果上面一个状态可以发展到其他状态,我们就认定他们有边的话,则a1到a2,a3,a4 有边(指a1:狼,羊,菜中,有可能把狼,羊,菜中其中的一种带走)
则上面的状态节点,就形成一个图结构其中
a1到a2,a3,a4有边
a2到a1,a5,a6有边
a3到a1,a6,a7有边
a4到a1,a5,a7有边
a5到a2,a8有边
a6到a3,a8有边
a7到a4,a8有边
那么整个题目就变成了,如何从a1走到a8,其中不能重复节点,而且节点a2(狼,羊),a3(羊,菜)不可走
题目就变成了一个图论中的路径问题。编程就不用我写了
15 楼
databoy [专家分:310] 发布于 2004-07-12 09:35:00
有没搞错哦,居然不加分~~
16 楼
inhapy [专家分:0] 发布于 2004-12-19 20:06:00
[font=隶书][/font][size=4][/size][color=808080][/color][em5]
17 楼
inhapy [专家分:0] 发布于 2004-12-19 20:08:00
[em5]有谁可以给这个程序写上 解析的啊 谢谢里
18 楼
feiyuan0204 [专家分:0] 发布于 2008-03-01 13:30:00
不游泳的鱼:非常棒,用数组的思想凝结而成!
void tryOneStep(int i)这个函数应用的更是精妙!一般人或许是想不出的··
佩服····
不建议我这个朋友的话,可否加450146727
19 楼
feiyuan0204 [专家分:0] 发布于 2008-03-01 13:31:00
// 农夫过河.cpp : 定义控制台应用程序的入口点。
//
#include <stdafx.h>
#include <stdio.h>
//0代表在河的这边.1代表在河的对岸
struct Condition {
int farmer;
int wolf;
int sheep;
int cabbage;
};//设置结构体
struct Condition conditions [100]; //结构体条件数组
char* action[100];//字符串数组
void takeWolfOver(int i)//把狼带过去
{
action[i] = "Take the wolf over.";
conditions[i+1].wolf=1;//狼带过去
conditions[i+1].sheep=conditions[i].sheep;//羊不动
conditions[i+1].cabbage=conditions[i].cabbage;//菜不动
}
void takeWolfBack(int i)//把狼带回来
{
action[i] = "Take the wolf back.";
conditions[i+1].wolf=0;
conditions[i+1].sheep=conditions[i].sheep;//羊不动
conditions[i+1].cabbage=conditions[i].cabbage;//菜不动
}
void takeSheepOver(int i)//把羊带过去
{
action[i] = "Take the sheep over.";
conditions[i+1].wolf=conditions[i].wolf;//狼不动
conditions[i+1].sheep=1;//羊带过去
conditions[i+1].cabbage=conditions[i].cabbage;//菜不动
}
void takeSheepBack(int i)//把羊带回来
{
action[i] = "Take the sheep back.";
conditions[i+1].wolf=conditions[i].wolf;
conditions[i+1].sheep=0;
conditions[i+1].cabbage=conditions[i].cabbage;
}
void takeCabbageOver(int i)//把菜带过去
{
action[i] = "Take the cabbage over.";
conditions[i+1].wolf=conditions[i].wolf;
conditions[i+1].sheep=conditions[i].sheep;
conditions[i+1].cabbage=1;
}
void takeCabbageBack(int i)//把菜带回来
{
action[i] = "Take the cabbage back.";
conditions[i+1].wolf=conditions[i].wolf;
conditions[i+1].sheep=conditions[i].sheep;
conditions[i+1].cabbage=0;
}
void getOverBarely(int i)//过河时的情况
{
action[i] = "Get over barely.";
//全不动
conditions[i+1].wolf=conditions[i].wolf;
conditions[i+1].sheep=conditions[i].sheep;
conditions[i+1].cabbage=conditions[i].cabbage;
}
void getBackBarely(int i)//返回时的情况
{
action[i] = "Get back barely.";
conditions[i+1].wolf=conditions[i].wolf;
conditions[i+1].sheep=conditions[i].sheep;
conditions[i+1].cabbage=conditions[i].cabbage;
}
void showSolution(int i)//显示解答方法
{
int c;
printf ("%s\n", "Solution:");
for(c=0; c<i; c++)
{
printf ("%d. %s\n", c+1, action[c]);//换行输出
}
printf ("%s\n", "Ok! Nice job!");
}
void tryOneStep(int i)//再试一遍
{
int c;
int j;
//检查循环是否出现问题.
if(i>=100)
{
printf("%s\n", "Index reached 100. Something is wrong. ");
return;
}
//检查是否都过河.
if(conditions[i].farmer==1&&
conditions[i].wolf==1&&
conditions[i].sheep==1&&
conditions[i].cabbage==1)
{
//是的,都过河了.返回
showSolution(i);
return;
}
//检查是否丢失,出错
if(
(conditions[i].farmer!=conditions[i].wolf && conditions[i].wolf==conditions[i].sheep)
||
(conditions[i].farmer!=conditions[i].sheep && conditions[i].sheep==conditions[i].cabbage)
)
{
//不,狼会吃掉羊,或者羊会吃掉菜的
return;
}
//检查条件是否满足.
for (c=0; c<i; c++)
{
if(conditions[c].farmer==conditions[i].farmer&&
conditions[c].wolf==conditions[i].wolf&&
conditions[c].sheep==conditions[i].sheep&&
conditions[c].cabbage==conditions[i].cabbage)
{
//条件相同满足题意,返回
return;
}
}
j=i+1;
if(conditions[i].farmer==0)//农夫在河这边
{
conditions[j].farmer=1;
getOverBarely(i);
tryOneStep(j);
if(conditions[i].wolf==0)//如果狼没带过去
{
takeWolfOver(i);
tryOneStep(j);
}
if(conditions[i].sheep==0)
{
takeSheepOver(i);
tryOneStep(j);
}
if(conditions[i].cabbage==0)
{
takeCabbageOver(i);
tryOneStep(j);
}
}
else
{
conditions[j].farmer=0;
getBackBarely(i);
tryOneStep(j);
if(conditions[i].wolf==1)
{
takeWolfBack(i);
tryOneStep(j);
}
if(conditions[i].sheep==1)
{
takeSheepBack(i);
tryOneStep(j);
}
if(conditions[i].cabbage==1)
{
takeCabbageBack(i);
tryOneStep(j);
}
}
}
int main()//主函数
{
//设置初始值
conditions[0].farmer = 0;
conditions[0].wolf = 0;
conditions[0].sheep = 0;
conditions[0].cabbage= 0;
//使用循环递回寻找解决办法.
tryOneStep(0);
}
20 楼
稀饭豁然 [专家分:100] 发布于 2008-03-14 17:09:00
data boy,你的程序错误好多哦
我来回复