数据结构与算法经典程序:农夫过河问题讲解
首先,在这里祝各位看到这条博客的同学五一快乐呀,今天,我们讲解一个数据结构与算法中的经典题目(小程序),题目如下:
题目:
一个农夫在河边带了一只狼、一只羊和一颗白菜,他需要把这三样东西用船带到河的对岸。然而,这艘船只能容下农夫本人和另外一样东西。如果农夫不在场的话,狼会吃掉羊,羊也会吃掉白菜。请编程为农夫解决这个过河问题。
思路:
看到这道题目,我们先缕清这几样东西(包括一个人)他们之间的关系。在这道题里,咱们只能两两组合。其中,有几个限制条件
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.顺序栈原理 2.栈的创建 3.顺序栈进栈 4.顺序栈出栈 5.顺序栈删除 6.清空栈与是否清空栈 三.链表栈的实现 1.栈的单链表实现 2.创建 ...
- 阿里架构师强烈推荐《数据结构与算法经典问题解析》(PDF文档)
前言: 小编整理了一份数据结构与算法经典问题解析核心知识点.覆盖递归和回溯.链表.栈.队列.树.优先队列和堆.队列.优先队列和堆.并查集ADT.排序.选择算法(中位数).散列.算法设计技术.分治算法. ...
- 【数据结构与算法】程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码
[数据结构与算法]程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码 文章目录 [数据结构与算法]程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码 1. 数组 (Arra ...
- 硬核 阿里P8终于把(数据结构与算法经典问题解析)讲全了
随着科学技术的发展,人工智能已经逐渐渗透到各个行业,这是一个相当有前景的专业领域. 其中,算法工程师这一职位更是非常火爆,在急缺大量人才的同时,也吸引了众多求职者,那么,初学者该如何学好算法呢? 算法 ...
- java数据结构 农夫过河_数据结构笔记分享:18 农夫过河(图的算法运用)
问题描述 一个农夫带着一只狼,一棵白菜和一只山羊要从一条河的南岸到北岸,农夫每次只能带一样东西过过河,但是任意时刻如果农夫不在场时,狼要吃羊.羊要吃菜,请为农夫设计过河方案. 分析: 要求解农夫过河问 ...
- 为什么“不懂数据结构与算法”的程序员一定走不远?
踏上了编程之路,也就意味着你选择了一种终身学习的生活方式.每一个程序员都要练就十八般武艺,而掌握数据结构与算法就像修炼了九阳神功.换句话说,掌握了数据结构与算法,你的内功修炼速度就会有质的飞跃. &q ...
- 数据结构与算法--经典10大排序算法(动图演示)【建议收藏】
十大经典排序算法总结(动图演示) 算法分类 十大常见排序算法可分为两大类: 比较排序算法:通过比较来决定元素的位置,由于时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序 非比较类型排 ...
- 顺序队列模板简单应用算法设计:农夫过河(这个比较难,我自己都觉得难)
文章目录 问题描述 : 输入说明 : 输出说明 : 输入范例 : 输出范例 : 思路分析 伪码实现 事故现场 第一次提交 分析与总结 如有不妥,或者疑问,请加扣扣651378276,一起商议学习进步 ...
- 农夫过河算法java,Java农夫过河问题的继承与多态实现详解
Java农夫过河问题的继承与多态实现详解 发布时间:2020-08-22 06:04:29 来源:脚本之家 阅读:61 作者:小任性嘛 题目描述: 一个农夫带着一匹狼.一只羊.一颗白菜要过河,只有一条 ...
最新文章
- 日常生活小技巧 -- UART 回环测试
- 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)
- BeetleX之Websocket协议分析详解
- php mysql练手_ThinkPHP5练手Demo实战
- 使用Fastjson提示No serializer found for class
- 7-46 最长对称子串 (25 分)
- 应用软件暗藏猫腻,信息安全咋保障
- Controller类中方法返回值详解
- 最新要饭网源码1.6终极版
- tnsping能成功却连不到目标数据库
- 一款非常好用的Markdown文档编辑器Typora
- 单链表就地逆置(Java版)
- 快递企业如何完成运单订阅消息的推送
- 六.卡尔曼滤波器开发实践之六: 无损卡尔曼滤波器(UKF)进阶-白话讲解篇
- bergerAimi
- 一师兄的面试经历:对于销售职位来…
- 正则虐我千百遍,我要反抗了
- zigbee无线传感网技术与应用开发v2.0_物联网通讯协议——Zigbee
- spring漏洞合集 下
- matlab画折现_MATLAB实例:绘制折线图
热门文章
- 【C语言】用二分查找法在有序数组中查找具体的某个数
- iphone - - 怎么导出ipa文件
- 关于 SecureFx传输远程服务器中文显示乱码 的解决方法
- ActivityNet数据集解析
- Java钉钉markdown模版,钉钉 dingding dingtalk prometheus报警模板template
- 任正非:不上市则有可能称霸世界 资本没有温度缺乏耐心
- Android 关于设置Dialog大小宽高和动画详解
- 设备异常状态检测相关内容(一)
- .net通过S7.net读写西门子PLC中,字符串,bool,整数,小数及byte型
- Git 中忽略某些文件或者文件夹