回 帖 发 新 帖 刷新版面

主题:用C语言编写“农夫过河问题”

农夫过河。一个农夫带着一只狼,一只羊和一些菜过河。河边只有一条一船,由
于船太小,只能装下农夫和他的一样东西。在无人看管的情况下,狼要吃羊,羊
要吃菜,请问农夫如何才能使三样东西平安过河。

回复列表 (共20个回复)

11 楼

设三个变量,用个递归不就得了。

12 楼

我记得以前就有类似的帖子了

有一家子过河,外加两个强盗什么的

翻翻前面的帖子

13 楼

/* 数字大小表示过河顺序的先后,数字大的先过*/

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 楼

这实际上一个图论中的路径问题

假定状态节点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 楼

有没搞错哦,居然不加分~~

16 楼

[font=隶书][/font][size=4][/size][color=808080][/color][em5]

17 楼

[em5]有谁可以给这个程序写上 解析的啊 谢谢里

18 楼

不游泳的鱼:非常棒,用数组的思想凝结而成!
void tryOneStep(int i)这个函数应用的更是精妙!一般人或许是想不出的··
佩服····
不建议我这个朋友的话,可否加450146727

19 楼

// 农夫过河.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 楼

data boy,你的程序错误好多哦

我来回复

您尚未登录,请登录后再回复。点此登录或注册