题目:
一个农夫在河边带了一只狼、一只羊和一颗白菜,他须要把这三样货色用船带到河的对岸。然而,这艘船只能容下农夫自己和另外一样货色。如果农夫不在场的话,狼会吃掉羊,羊也会吃掉白菜。请编程为农夫解决这个过河问题。

思路:

看到这道题目,咱们先缕清这几样货色(包含一个人)他们之间的关系。在这道题里,咱们只能两两组合。其中,有几个限度条件
1.狼不能和羊在一起
2.羊不能和白菜在一起
(这两个条件也会成为咱们之后算法里逻辑做限度的一部分)

命名相干变量
当初,咱们对它们进行命名,咱们先用数字示意这些货色(和人)
0——狼、1——羊、2——白菜、3——农夫
(记得肯定是从0开始标记哦)

接下来,咱们就是标记河的两岸,咱们给河的两岸别离示意为东岸和西岸(当然北岸和南岸也行,随便啦)。以此证实他们达到,为了让咱们的计算机可能看懂,咱们示意为
0——起始河岸
1——达到的河岸

如果狼达到了对岸,咱们用数组就能够示意为aStep 1,其余同理。
(这里的a数组示意存储每一步中各个对象所处的地位,除此之外,咱们还须要数组b[N]来存储每一步中农夫是如何过河的)

因而,残缺代码如下:

#include <stdio.h>#include <stdlib.h>#include <string.h>#define N 15int a[N][4];int b[N];char* name[] ={ "     ", "and wolf", "and goat", "and cabbage"};int search(int step){    int i;    if (a[step][0] + a[step][1] + a[step][2] + a[step][3] = 4)    {        for (i = 0; i <= step; i++)        {            printf("east;");            if (a[i][0] == 0)                printf("wolf  ");            if (a[i][1] == 0)                printf("goat ");            if (a[i][2] == 0)                printf("cabbage");            if (a[i][3] == 0)                printf("farmer");            if (a[i][0] && a[i][1] && a[i][2] && a[i][3])                printf("none");            printf("                    ");            printf("west;");            if (a[i][0] == 1)                printf("wolf ");            if (a[i][1] == 1)                printf("goat  ");            if (a[i][2] == 1)                printf("cabbage  ");            if (a[i][3] == 1)                printf("farmer  ");            if (!(a[i][0] || a[i][1] || a[i][2] || a[i][3]))                printf("none");            printf("\n\n\n");            if (i < Step)                printf("                       the %d time\n", i + 1);            if (i > 0 && i < Step)            {                if (a[i][3] == 0)  /*农夫在本岸*/                {                    printf("                  ----->  farmer ");                    printf("%s\n", name[b[i] + 1]);                }                else      /*农夫在对岸*/                {                    printf("                  <-----  farmer ");                    printf("%s\n", name[b[i] + 1]);                }            }        }        printf("\n\n\n\n");        return 0;    }    for (i = 0; i < Step; i++)    {        if (memcmp(a[i], a[Step], 16) == 0)  /*若该步与以前步骤雷同,勾销操作*/        {            return 0;        }    }    /*若羊和农夫不在一块而狼和羊或者羊和白菜在一块,则勾销操作*/    if (a[Step][1] != a[Step][3] && (a[Step][2] == a[Step][1] || a[Step][0] == a[Step][1]))    {        return 0;    }    /*递归,从带第一种动物开始顺次向下循环,同时限定递归的界线*/    for (i = -1; i <= 2; i++)    {        b[Step] = i;        memcpy(a[Step + 1], a[Step], 16);  /*复制上一步状态,进行下一步挪动*/        a[Step + 1][3] = 1 - a[Step + 1][3];  /*农夫过来或者回来*/        if (i == -1)        {            search(Step + 1);  /*进行第一步*/        }        else            if (a[Step][i] == a[Step][3])  /*若该物与农夫同岸,带回*/            {                a[Step + 1][i] = a[Step + 1][3];  /*带回该物*/                search(Step + 1);  /*进行下一步*/            }    }    return 0;}int main(){    printf("\n\n             农夫过河问题,解决方案如下:\n\n\n");    search(0);    return 0;}