首先,在这里祝各位看到这条博客的同学五一快乐呀,今天,我们讲解一个数据结构与算法中的经典题目(小程序),题目如下:

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

思路:

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

命名相关变量
现在,我们对它们进行命名,我们先用数字表示这些东西(和人)
0——狼、1——羊、2——白菜、3——农夫
(记得一定是从0开始标记哦)

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

如果狼到达了对岸,我们用数组就可以表示为a[Step][0] 1,其他同理。
(这里的a数组表示存储每一步中各个对象所处的位置,除此之外,我们还需要数组b[N]来存储每一步中农夫是如何过河的)

因此,完整代码如下;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 15
int 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);  /*进行第一步*/}elseif (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;}

这道题总的来说有些复杂(对于初学者来说),不过没关系,只要肯下功夫和时间,我们一步步也能学好。
真诚的希望我的博客能帮到遇到这个问题的同学!

数据结构与算法经典程序:农夫过河问题讲解相关推荐

  1. 【数据结构与算法】程序内功篇四--栈

    程序内功篇四--栈 一.栈的原理 二.顺序栈的实现 1.顺序栈原理 2.栈的创建 3.顺序栈进栈 4.顺序栈出栈 5.顺序栈删除 6.清空栈与是否清空栈 三.链表栈的实现 1.栈的单链表实现 2.创建 ...

  2. 阿里架构师强烈推荐《数据结构与算法经典问题解析》(PDF文档)

    前言: 小编整理了一份数据结构与算法经典问题解析核心知识点.覆盖递归和回溯.链表.栈.队列.树.优先队列和堆.队列.优先队列和堆.并查集ADT.排序.选择算法(中位数).散列.算法设计技术.分治算法. ...

  3. 【数据结构与算法】程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码

    [数据结构与算法]程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码 文章目录 [数据结构与算法]程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码 1. 数组 (Arra ...

  4. 硬核 阿里P8终于把(数据结构与算法经典问题解析)讲全了

    随着科学技术的发展,人工智能已经逐渐渗透到各个行业,这是一个相当有前景的专业领域. 其中,算法工程师这一职位更是非常火爆,在急缺大量人才的同时,也吸引了众多求职者,那么,初学者该如何学好算法呢? 算法 ...

  5. java数据结构 农夫过河_数据结构笔记分享:18 农夫过河(图的算法运用)

    问题描述 一个农夫带着一只狼,一棵白菜和一只山羊要从一条河的南岸到北岸,农夫每次只能带一样东西过过河,但是任意时刻如果农夫不在场时,狼要吃羊.羊要吃菜,请为农夫设计过河方案. 分析: 要求解农夫过河问 ...

  6. 为什么“不懂数据结构与算法”的程序员一定走不远?

    踏上了编程之路,也就意味着你选择了一种终身学习的生活方式.每一个程序员都要练就十八般武艺,而掌握数据结构与算法就像修炼了九阳神功.换句话说,掌握了数据结构与算法,你的内功修炼速度就会有质的飞跃. &q ...

  7. 数据结构与算法--经典10大排序算法(动图演示)【建议收藏】

    十大经典排序算法总结(动图演示) 算法分类 十大常见排序算法可分为两大类: 比较排序算法:通过比较来决定元素的位置,由于时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序 非比较类型排 ...

  8. 顺序队列模板简单应用算法设计:农夫过河(这个比较难,我自己都觉得难)

    文章目录 问题描述 : 输入说明 : 输出说明 : 输入范例 : 输出范例 : 思路分析 伪码实现 事故现场 第一次提交 分析与总结 如有不妥,或者疑问,请加扣扣651378276,一起商议学习进步 ...

  9. 农夫过河算法java,Java农夫过河问题的继承与多态实现详解

    Java农夫过河问题的继承与多态实现详解 发布时间:2020-08-22 06:04:29 来源:脚本之家 阅读:61 作者:小任性嘛 题目描述: 一个农夫带着一匹狼.一只羊.一颗白菜要过河,只有一条 ...

最新文章

  1. 日常生活小技巧 -- UART 回环测试
  2. 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)
  3. BeetleX之Websocket协议分析详解
  4. php mysql练手_ThinkPHP5练手Demo实战
  5. 使用Fastjson提示No serializer found for class
  6. 7-46 最长对称子串 (25 分)
  7. 应用软件暗藏猫腻,信息安全咋保障
  8. Controller类中方法返回值详解
  9. 最新要饭网源码1.6终极版
  10. tnsping能成功却连不到目标数据库
  11. 一款非常好用的Markdown文档编辑器Typora
  12. 单链表就地逆置(Java版)
  13. 快递企业如何完成运单订阅消息的推送
  14. 六.卡尔曼滤波器开发实践之六: 无损卡尔曼滤波器(UKF)进阶-白话讲解篇
  15. bergerAimi
  16. 一师兄的面试经历:对于销售职位来…
  17. 正则虐我千百遍,我要反抗了
  18. zigbee无线传感网技术与应用开发v2.0_物联网通讯协议——Zigbee
  19. spring漏洞合集 下
  20. matlab画折现_MATLAB实例:绘制折线图

热门文章

  1. 【C语言】用二分查找法在有序数组中查找具体的某个数
  2. iphone - - 怎么导出ipa文件
  3. 关于 SecureFx传输远程服务器中文显示乱码 的解决方法
  4. ActivityNet数据集解析
  5. Java钉钉markdown模版,钉钉 dingding dingtalk prometheus报警模板template
  6. 任正非:不上市则有可能称霸世界 资本没有温度缺乏耐心
  7. Android 关于设置Dialog大小宽高和动画详解
  8. 设备异常状态检测相关内容(一)
  9. .net通过S7.net读写西门子PLC中,字符串,bool,整数,小数及byte型
  10. Git 中忽略某些文件或者文件夹