农夫过河实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
是
是
否
否
是
图2确定状态的安全有效性的功能模块设计算法流程图
(3)输出模块设计
输出农夫过河问题的可行性方案时,可从目标状态(1111)开始,将其记入队列(或栈)中,然后再找出其前驱,记入队列(或栈)中,然后在找其前驱,…,直到找到的是开始状态(0000)为止。要求输出时根据位置分布代码(即4位二进制数)各个位置上的0、1代码所表示的含义输出容易理解的文字。
(2)为农夫过河问题抽象数据模型,体会数据模型在求解问题中的重要作用。
(3)掌握顺序表和队列的逻辑结构和存储结构。
2.系统需求分析
(1)针对实现整个过程需要多步,不同步骤中各个事物所处位置不同的情况,可定义一个结构体来实现对四个对象狼、羊、白菜和农夫的表示。对于起始岸和目的岸,可以用0或者1来表示,以实现在程序设计中的简便性。
(2)确定状态的安全有效性的功能模块设计
通过位置分布的代码来判断当前状态是否安全,使用“与”位操作来考察狼和羊、羊和白菜是否在同一侧,且它们与农夫不一侧。若是,该状态即为不安全状态,否则为安全状态。若一个状态已经被访问过,或只有农夫一人从南岸过到北岸,则该状态被判为无效状态。若状态安全且有效,则返回1,否则返回0。该模块算法流程图如图2所示。
{
int f, r; //f表示头,r表示尾
int q[MAXNUM];//顺序队
}SqQueue ,*SqQueuePtr;
SqQueuePtr createEmptySQueue()//创建空队列
{
SqQueuePtr squeue = new SqQueue;
参考文献
[1]严蔚敏,冬梅,吴伟民.数据结构(C语言版)[M].:人民邮电,2011:54-110.
附录
1.广度优先算法
#include<iostream>
#include<cstdlib>
#define MAXNUM 20
using namespace std;
typedef struct //顺序队列类型定义
北岸白菜
第5步:南岸羊
北岸农夫狼白菜
第6步:南岸农夫羊
北岸狼白菜
第7步:南岸
北岸农夫狼白菜羊
与预期结果相同
6.小结
(1)通过这2周的程序设计使我了解到了自己在数据结构方面的不足,也坚定了我学好编程的信心。
(2)采用广度优先的算法,利用数组只能记寻前一个前驱,导致另一个路径的丢失,不是很令人满意,所以采用第二种算法,深度优先算法,利用栈来记录路径前驱。
(2)题目要求给出四种事物的过河步骤,没有对先后顺序进行约束,这就需要给各个事物依次进行编号,然后依次试探,若试探成功,进行下一步试探。这就需要使用循环或者递归算法,避免随机盲目运算且保证每种情况均试探到,不接受非法输入。
(3)题目要求求出农夫带一只羊,一条狼和一颗白菜过河的办法,所以依次成功返回运算结果后,需要继续运算,直至求出结果,即给出农夫的过河方案。
输出界面要求具有每一步中农夫所带对象及每步之后各岸的物体,需要定义不同的数组来分别存储上述容,并使界面所示方案清晰简洁。
(4)实验运行环境为VC++6.0.
3.系统概要设计
(1)数据结构设计
要模拟农夫过河的问题,用四位二进制数顺序分别表示农夫,狼,羊,白菜的位置。用0表示农夫或某种东西在河的南岸,1表示在河的北岸。则问题的初始状态是整数(二进制数表示为0000);问题的终结状态是整数15(二进制表示为1111)。
“数据结构与算法综合实验”课程设计报告
题目:
农夫过河问题
学院
计算机科学技术
年级
2014级
专业
计算机科学与技术
学号
20142060
姓名
高晗
日期
2016年3月30日星期三
成绩
评语
大学
计算机科学技术学院、软件学院
《数据结构与算法综合实验》报告
1.系统பைடு நூலகம்述
(1)一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸,他要把这些东西全部运到北岸。他面前只有一只小船,船只能容下他和一件物品,另外只有农夫才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜;否则狼会吃羊,羊会吃白菜。所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,但是狼不吃白菜。要求给出农夫将所有东西运过河的方案。
x
图1系统状态转换结构图
(2)软件结构设计
农夫过河管理系统根据需求分析中的功能分析,可以提炼出主要有搜索功能,判断事物安全功能,输出过河方案功能。而搜索功能又可以利用不同算法,如广度优先算法,深度优先算法等等。判断事物安全功能需要将事物位置进行分析,通过位置分布的代码来判断当前状态是否安全,使用“与”位操作来考察狼和羊、羊和白菜是否在同一侧,且它们与农夫不一侧。若是,该状态即为不安全状态,否则为安全状态。若一个状态已经被访问过,或只有农夫一人从南岸过到北岸,则该状态被判为无效状态。输出功能就是将过河方案在屏幕上进行显示。系统软件结构如图1所示
用一个整数队列MoveTo把搜索过程中所有可能达到的状态都保存起来。队列中的每一个元素表示一个可以到达的中间状态。另外用一个整数数组route记录被访问过的状态,以及已经被发现的能够到达这些状态的前驱。数组只需使用16个元素,每个元素的初始化值均为-1,每当队列中加入一个新状态时,数组中以该状态做下标的元素改为到达这一状态的前一状态的下标值。所以数组的第i个元素不仅记录状态i是否被过,同时还保存该状态的前驱状态下标。算法结束后可以利用route数组元素的值生成一个正确的状态路径。系统状态转换结构如图1所示:
5.系统测试
对于该程序而言并没有实际输入,需要观察的就是输出结果。对于该程序的测试及其测试用例如表3所示。
表3输出测试用例
测试容
测试用例
预期结果
实际结果
输出过河方案具体步骤
无
第0步:南岸农夫狼白菜羊
北岸
第1步:南岸狼白菜
北岸农夫羊
第2步:南岸农夫狼白菜
北岸羊
第3步:南岸狼
北岸农夫羊白菜
第4步:南岸农夫狼羊
图1农夫过河管理系统软件模块结构图
4.系统详细设计与实现
(1)搜索算法设计
搜索过程可利用广度优先搜索算法从初始状态二进制0000(全部在河的南岸)出发,寻找一种全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸)为最终目标,并且在序列中的每一个状态都可以从前一个状态得到。为避免重复,要求在序列中不出现重复的状态。
是
否
否
是
图2确定状态的安全有效性的功能模块设计算法流程图
(3)输出模块设计
输出农夫过河问题的可行性方案时,可从目标状态(1111)开始,将其记入队列(或栈)中,然后再找出其前驱,记入队列(或栈)中,然后在找其前驱,…,直到找到的是开始状态(0000)为止。要求输出时根据位置分布代码(即4位二进制数)各个位置上的0、1代码所表示的含义输出容易理解的文字。
(2)为农夫过河问题抽象数据模型,体会数据模型在求解问题中的重要作用。
(3)掌握顺序表和队列的逻辑结构和存储结构。
2.系统需求分析
(1)针对实现整个过程需要多步,不同步骤中各个事物所处位置不同的情况,可定义一个结构体来实现对四个对象狼、羊、白菜和农夫的表示。对于起始岸和目的岸,可以用0或者1来表示,以实现在程序设计中的简便性。
(2)确定状态的安全有效性的功能模块设计
通过位置分布的代码来判断当前状态是否安全,使用“与”位操作来考察狼和羊、羊和白菜是否在同一侧,且它们与农夫不一侧。若是,该状态即为不安全状态,否则为安全状态。若一个状态已经被访问过,或只有农夫一人从南岸过到北岸,则该状态被判为无效状态。若状态安全且有效,则返回1,否则返回0。该模块算法流程图如图2所示。
{
int f, r; //f表示头,r表示尾
int q[MAXNUM];//顺序队
}SqQueue ,*SqQueuePtr;
SqQueuePtr createEmptySQueue()//创建空队列
{
SqQueuePtr squeue = new SqQueue;
参考文献
[1]严蔚敏,冬梅,吴伟民.数据结构(C语言版)[M].:人民邮电,2011:54-110.
附录
1.广度优先算法
#include<iostream>
#include<cstdlib>
#define MAXNUM 20
using namespace std;
typedef struct //顺序队列类型定义
北岸白菜
第5步:南岸羊
北岸农夫狼白菜
第6步:南岸农夫羊
北岸狼白菜
第7步:南岸
北岸农夫狼白菜羊
与预期结果相同
6.小结
(1)通过这2周的程序设计使我了解到了自己在数据结构方面的不足,也坚定了我学好编程的信心。
(2)采用广度优先的算法,利用数组只能记寻前一个前驱,导致另一个路径的丢失,不是很令人满意,所以采用第二种算法,深度优先算法,利用栈来记录路径前驱。
(2)题目要求给出四种事物的过河步骤,没有对先后顺序进行约束,这就需要给各个事物依次进行编号,然后依次试探,若试探成功,进行下一步试探。这就需要使用循环或者递归算法,避免随机盲目运算且保证每种情况均试探到,不接受非法输入。
(3)题目要求求出农夫带一只羊,一条狼和一颗白菜过河的办法,所以依次成功返回运算结果后,需要继续运算,直至求出结果,即给出农夫的过河方案。
输出界面要求具有每一步中农夫所带对象及每步之后各岸的物体,需要定义不同的数组来分别存储上述容,并使界面所示方案清晰简洁。
(4)实验运行环境为VC++6.0.
3.系统概要设计
(1)数据结构设计
要模拟农夫过河的问题,用四位二进制数顺序分别表示农夫,狼,羊,白菜的位置。用0表示农夫或某种东西在河的南岸,1表示在河的北岸。则问题的初始状态是整数(二进制数表示为0000);问题的终结状态是整数15(二进制表示为1111)。
“数据结构与算法综合实验”课程设计报告
题目:
农夫过河问题
学院
计算机科学技术
年级
2014级
专业
计算机科学与技术
学号
20142060
姓名
高晗
日期
2016年3月30日星期三
成绩
评语
大学
计算机科学技术学院、软件学院
《数据结构与算法综合实验》报告
1.系统பைடு நூலகம்述
(1)一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸,他要把这些东西全部运到北岸。他面前只有一只小船,船只能容下他和一件物品,另外只有农夫才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜;否则狼会吃羊,羊会吃白菜。所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,但是狼不吃白菜。要求给出农夫将所有东西运过河的方案。
x
图1系统状态转换结构图
(2)软件结构设计
农夫过河管理系统根据需求分析中的功能分析,可以提炼出主要有搜索功能,判断事物安全功能,输出过河方案功能。而搜索功能又可以利用不同算法,如广度优先算法,深度优先算法等等。判断事物安全功能需要将事物位置进行分析,通过位置分布的代码来判断当前状态是否安全,使用“与”位操作来考察狼和羊、羊和白菜是否在同一侧,且它们与农夫不一侧。若是,该状态即为不安全状态,否则为安全状态。若一个状态已经被访问过,或只有农夫一人从南岸过到北岸,则该状态被判为无效状态。输出功能就是将过河方案在屏幕上进行显示。系统软件结构如图1所示
用一个整数队列MoveTo把搜索过程中所有可能达到的状态都保存起来。队列中的每一个元素表示一个可以到达的中间状态。另外用一个整数数组route记录被访问过的状态,以及已经被发现的能够到达这些状态的前驱。数组只需使用16个元素,每个元素的初始化值均为-1,每当队列中加入一个新状态时,数组中以该状态做下标的元素改为到达这一状态的前一状态的下标值。所以数组的第i个元素不仅记录状态i是否被过,同时还保存该状态的前驱状态下标。算法结束后可以利用route数组元素的值生成一个正确的状态路径。系统状态转换结构如图1所示:
5.系统测试
对于该程序而言并没有实际输入,需要观察的就是输出结果。对于该程序的测试及其测试用例如表3所示。
表3输出测试用例
测试容
测试用例
预期结果
实际结果
输出过河方案具体步骤
无
第0步:南岸农夫狼白菜羊
北岸
第1步:南岸狼白菜
北岸农夫羊
第2步:南岸农夫狼白菜
北岸羊
第3步:南岸狼
北岸农夫羊白菜
第4步:南岸农夫狼羊
图1农夫过河管理系统软件模块结构图
4.系统详细设计与实现
(1)搜索算法设计
搜索过程可利用广度优先搜索算法从初始状态二进制0000(全部在河的南岸)出发,寻找一种全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸)为最终目标,并且在序列中的每一个状态都可以从前一个状态得到。为避免重复,要求在序列中不出现重复的状态。