农夫过河实验报告

合集下载

农夫过河

农夫过河
}
else
{
graph->Edge[i][j] = graph->Edge[j][i] = false;
}
}
}
return;
}
// 判断在河的那一边
char* judgement(int state)
{
return ( (0 == state) ? "左岸" : "右岸" );
// 查找顶点(F,W,S,V)在顶点向量中的位置
int locate(AdjGraph *graph, int farmer, int wolf, int sheep, int veget)
{
// 从0开始查找
for (int i = 0; i < graph->vertexNum; i++)
{
graph->vertex[i].farmer = farmer;
graph->vertex[i].wolf = wolf;
graph->vertex[i].sheep = sheep;
}
void enQueue_seq( PSeqQueue paqu, DataType x ) {
if ( (paqu->r + 1) % MAXNUM == paqu->f )
printf( "Full queue.\n" );
else {
paqu->q[paqu->r] = x;
{
return i; //返回当前位置
}
}
return -1; //没有找到此顶点

数据结构课程设计报告(农夫过河)

数据结构课程设计报告(农夫过河)

数据结构课程设计报告(农夫过河)第一篇:数据结构课程设计报告(农夫过河)目录引言...................................................2 问题描述..............................................3 基本要求 (3)2.1为农夫过河问题抽象数据模型体会数据模型在问题求解中的重要性;........3 2.2设计一个算法求解农夫过河问题,并输出过河方案;......................3 3 概要设计 (3)3.1 数据结构的设计。

....................................................3 3.1.1农夫过河问题的模型化.............................................3 3.1.2 算法的设计 (4)4、运行与测试 (6)5、总结与心得..........................................7 附录...................................................7 参考文献. (13)引言所谓农夫过河问题是指农夫带一只狼、一只羊和一棵白菜在河南岸, 需要安全运到北岸。

一条小船只能容下他和一件物品, 只有农夫能撑船。

问农夫怎么能安全过河, 当然狼吃羊, 羊吃白菜, 农夫不能将这两种或三种物品单独放在河的一侧, 因为没有农夫的照看, 狼就要吃羊, 而羊可能要吃白菜? 这类问题的实质是系统的状态问题, 要寻求的是从初始状态经一系列的安全状态到达系统的终止状态的一条路径。

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

基本要求2.1为农夫过河问题抽象数据模型体会数据模型在问题求解中的重要性;2.2设计一个算法求解农夫过河问题,并输出过河方案;概要设计3.1 数据结构的设计。

农夫过河 实验报告

农夫过河 实验报告

程序设计报告(2010 / 2011 学年第一学期)题目:益智游戏—农夫过河专业网络工程学生姓名崔策班级学号B09011834指导教师王雪梅指导单位计算机软件教学中心日期2010年10月28日益智游戏—农夫过河一、课题内容和要求1、本课题要求出完整程序,能够解决下面的问题:一个农夫带着一只羊,一条狼和一颗白菜想从河的东岸到西岸去。

河上仅有一条船。

假设他每次只能带一只羊,或者一条狼,或者一颗白菜过河,并且当人不在场时,狼和羊,或羊和白菜不能单独在一起。

求出他带一只羊,一条狼和一颗白菜过河的所有办法。

2、题目要求如下:(1)不需要从键盘读入数据。

结果输出时,为便于观察,以文字的形式输出过河的全过程,列出所有可能的过河过程。

格式如下:east : farmer goat wolf cabbage west : noneThe 1 timee ast : wolf cabbage west : farmer goat←------ farmereast : farmer wolf cabbage west : goatThe 2 time------→ farmer and wolfeast : cabbage west : farmer goat wolf←------ farmer and goateast : farmer goat cabbage west : wolf……east : none west : farmer goat wolf cabbage (2)变量、函数命名符合规范。

(3)注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。

(4)程序的层次清晰,可读性强。

二、需求分析1、题目要求狼和羊、羊和白菜不能单独在一起,涉及对象较多,而且运算步骤方法较为复杂,要用程序语言实现,需要将具体实例数字化。

针对实现整个过程需要多步,不同步骤中各个事物所处位置不同的情况,可定义一个二维数组或者结构体来实现对四个对象狼、羊、白菜和农夫的表示。

农夫过河

农夫过河

农夫过河1、问题描述一农夫带着一只羊、一只狼和一颗白菜过河(从左岸到右岸)。

河边只有一条船,由于船太小,只能装下农夫和他的一样东西。

在无人看管的情况下,狼要吃羊,羊要吃菜。

现所编写的程序是为了解决三样东西平安过河的问题。

现将农夫和这三样东西抽象成四个元素,它们各自分别有0和1状态,且初态是0000,那么所解决的问题便转换为如何将0000从安全状态过渡到1111。

2、设计思路本程序通过将问题抽象成四个元素从0000状态以安全状态转为1111,而使问题模型化。

然后通过建立队列来存储安全到达的中间状态,并且通过定义数组来记录已考虑的状态路径。

相应功能的实现是通过定义函数来实现的。

农夫、狼、白菜、羊的位置的判断是通过定义了函数int Nongfu(int location),int Lang(int location),int Baicai(int location),int Yang(int location)来实现的。

而对于安全状态的判断则是定义了函数int Safe(int location)。

最后就是通过主函数来调用相应的函数以实现程序功能。

在主函数中,首先将初状态(初始位置)存入队列然后通过不断的改变状态以及判断是否安全来逐渐接近最终的状态(1111)。

如果route[15] != - 1,则说明成功到达了安全状态,问题有解;否则问题无解。

3、数据结构设计在前面的叙述中提到本程序会用到队列。

在队列中定义了队列的存储容量,以及队头和队尾指针。

然后定义函数PSeqQueue createEmptyQueue_seq(int m)来创建空队列。

以及函数void InQueue_seq(PSeqQueue queue, int x),void DeleteQueue_seq(PSeqQueue queue),int FrontQueue_seq(PSeqQueue queue)来分别实现在队尾插入元素,删除队列头部元素,取队头状态,以代表将新状态入队,删除原先的状态以及取相应的状态。

强渡大渡河实验报告

强渡大渡河实验报告

强渡大渡河实验报告
实验背景
强渡大渡河(Dongudarre)是一个短暂的实验,它通过发射和捕捉精密计算机控制的、紧凑的微型水面艇来测定污染水管道质量。

在实验中,测试由多个船只编队组成,以确保较小的工作环境和更专业的工作流程。

实验目的
实验的主要目的在于评估带污染物的水管道质量,以确定是否可以在
更大的范围内提供有用的服务。

此外,还可以测试水管道的温度、溶
氧量、油水混杂程度和污染物的形态,以及污染物的质量等指标,以
及如何能够确保在运输和处理过程中的安全性。

实验方法
为了实现实验目标,采用了以下几个主要方法:
1.实施紧凑、自由式编队测定任务,使用微型水面艇发射和接收计算机控制信号;
2.利用高精度的监测技术,获取水管道的温度、溶氧量、油水混杂程度和污染物的形态等性能参数,并将其量化;
3.针对污染物的质量,实施来自的抽样和筛选,进行完整的化验分析;
4.利用微型水面艇和自动控制运输系统,对水管道的操控运输进行模拟。

实验结果
根据实验结果,带污染物的水管道质量可以承受更大的范围的有效服务,在工程施工过程中也较为稳定。

溶氧量较为合理,温度正常,油
水混杂程度较低,而且污染物的形态更加稳定。

此外,在污染物的质
量方面,实验表明污染物的浓度在正常范围内,污染物的流动特性也
较为稳定。

结论
本次实验证实,带污染物的水管道质量可以承受更大的范围的有效服务,溶氧量、温度、油水混杂程度以及污染物的形态均在正常范围内,而且污染物的质量也较为稳定,因此,可以肯定的是,这种水管道质
量是能够确保在运输和处理过程中的安全性。

农夫过河-三年级-数学PPT

农夫过河-三年级-数学PPT
农夫过河
1
一位农民伯伯带着一条狗、一只鸡和一袋米去 集市,路上遇到一条河,河面上有条小船
2
聪明的同学们帮这位 农民伯伯想一想,怎么才 能把3样东西都带过河去, 并且 一样都不受损失呢?
3
有了:
➢第一次渡河:先带鸡带过河,因为狗不 吃米.而后,空船回来。
➢第二次渡河:带狗或带米过河都可以, 农民伯伯就带狗过河,过河后,若将狗 放下,狗吃鸡,因此,必须把鸡带回来。
➢第三次渡河:把鸡放下,把米带过河,而 后空船返回。
➢第四次渡河:再把鸡带过河。
4
5
才的发言,如 有不当之处请多指
正。谢谢大家!
6

关于农活的实验报告

关于农活的实验报告

一、实验目的1. 了解我国农业生产的基本流程和农活种类。

2. 掌握农活的基本操作方法,提高农业技术水平。

3. 培养学生对农业生产的兴趣和热爱,增强社会责任感。

二、实验时间2022年X月X日三、实验地点某农村地区四、实验内容1. 耕地(1)观察耕地前的土地状况,了解土地的肥力、土壤质地等。

(2)使用犁、耙等工具进行耕地,观察耕地的深度和均匀度。

(3)分析耕地过程中遇到的问题,如土壤板结、杂草等,并提出解决方案。

2. 播种(1)观察播种前的土地状况,了解土地的肥力、土壤质地等。

(2)选择合适的种子,进行播种,观察播种的深度和密度。

(3)分析播种过程中遇到的问题,如种子发芽率低、病虫害等,并提出解决方案。

3. 浇水(1)观察作物生长情况,了解作物的需水量。

(2)使用灌溉设备进行浇水,观察浇水的均匀度。

(3)分析浇水过程中遇到的问题,如水量不足、水流失等,并提出解决方案。

4. 施肥(1)观察作物生长情况,了解作物的需肥量。

(2)选择合适的肥料,进行施肥,观察施肥的效果。

(3)分析施肥过程中遇到的问题,如肥料施用不当、病虫害等,并提出解决方案。

5. 除草(1)观察作物生长情况,了解杂草的生长情况。

(2)使用除草剂、手工除草等方法进行除草,观察除草的效果。

(3)分析除草过程中遇到的问题,如除草剂残留、杂草反弹等,并提出解决方案。

五、实验结果与分析1. 耕地实验结果:通过观察耕地前的土地状况,了解到该土地肥力较好,土壤质地适宜。

在耕地过程中,使用犁、耙等工具将土地耕深至20cm,确保作物根系发育良好。

针对土壤板结问题,采取了深翻、松土等措施,提高了土壤通气性和保水性。

2. 播种实验结果:播种前,选择优质种子,播种深度为2-3cm,密度适中。

在播种过程中,注意了播种的均匀性,确保作物生长整齐。

针对种子发芽率低的问题,采取了提前浸种、催芽等措施,提高了发芽率。

3. 浇水实验结果:根据作物生长情况,合理调配水量,确保作物生长所需水分。

农夫过河C语言课程设计

农夫过河C语言课程设计

农夫过河C语言课程设计一、课程目标知识目标:1. 理解C语言中基本的数据类型和语法结构;2. 学会使用C语言进行逻辑判断和循环控制;3. 掌握C语言中的函数定义和调用方法;4. 了解“农夫过河”问题的背景和解决方案。

技能目标:1. 能够运用C语言编写出解决“农夫过河”问题的程序;2. 培养逻辑思维和问题分析能力,将实际问题转化为程序代码;3. 提高编程实践能力,学会调试和修改代码,解决程序中的错误。

情感态度价值观目标:1. 激发学生对编程的兴趣,培养计算机科学素养;2. 培养学生面对问题积极思考、勇于探索的精神;3. 强调团队合作,学会与他人共同解决问题,培养沟通与协作能力。

分析课程性质、学生特点和教学要求:本课程为C语言编程课程,旨在让学生掌握C语言的基本知识,并通过解决实际问题,提高编程能力。

学生为初中生,具有一定的逻辑思维能力和数学基础。

教学要求注重实践,将理论教学与实际操作相结合,引导学生主动参与,培养其独立思考和解决问题的能力。

课程目标分解:1. 知识目标:通过讲解和实例演示,让学生掌握C语言的基本知识;2. 技能目标:通过编写“农夫过河”程序,提高学生的编程实践能力;3. 情感态度价值观目标:通过课程教学,激发学生对编程的兴趣,培养其积极思考、勇于探索的精神,以及团队合作能力。

二、教学内容1. C语言基础知识回顾:- 数据类型、变量、常量- 运算符、表达式、语句- 选择结构(if-else)- 循环结构(for、while、do-while)2. 函数定义与调用:- 函数的概念和作用- 函数的定义、声明和调用- 递归函数的原理和应用3. “农夫过河”问题分析:- 问题的描述和规则- 状态表示和状态空间- 搜索策略(深度优先、广度优先)4. 编程实践:- 设计“农夫过河”问题的算法- 编写C语言程序实现算法- 调试和优化程序5. 教学内容安排与进度:- 第一课时:C语言基础知识回顾,引入“农夫过河”问题- 第二课时:函数定义与调用,分析问题并设计算法- 第三课时:编写程序,实现“农夫过河”算法- 第四课时:调试优化程序,总结经验,展示成果教学内容关联教材章节:- 《C语言程序设计》第一章:C语言概述- 《C语言程序设计》第二章:数据类型与运算符- 《C语言程序设计》第三章:控制结构- 《C语言程序设计》第四章:函数- 《C语言程序设计》第十章:算法与程序设计实例教学内容注重科学性和系统性,结合教材章节,使学生能够在掌握C语言基础知识的基础上,学会解决实际问题,提高编程能力。

课程设计农夫过河

课程设计农夫过河

课程设计农夫过河一、教学目标本章节的教学目标包括以下三个方面:1.知识目标:学生能够理解并掌握“农夫过河”问题的背景、条件和目标,了解相关的数学知识,如线性方程、不等式等。

2.技能目标:学生能够运用所学的数学知识,通过分析和逻辑推理,找到解决问题的方法,并能够进行有效的沟通和合作。

3.情感态度价值观目标:学生能够培养问题解决的兴趣和自信心,培养团队合作和沟通的能力,培养对数学学科的积极态度。

二、教学内容本章节的教学内容主要包括以下几个部分:1.引入“农夫过河”问题的背景和条件,引导学生了解问题的目标和意义。

2.引导学生学习相关的数学知识,如线性方程、不等式等,并通过例题和练习题进行巩固。

3.引导学生运用所学的数学知识,分析和解决“农夫过河”问题,寻找最优解法。

4.通过小组讨论和展示,培养学生的团队合作和沟通能力。

三、教学方法本章节的教学方法主要包括以下几种:1.讲授法:教师通过讲解和演示,引导学生理解和掌握相关的数学知识和解决问题的方法。

2.讨论法:教师学生进行小组讨论,鼓励学生提出问题、分享思路和解决方案。

3.案例分析法:教师提供具体的案例,引导学生运用所学的数学知识进行分析和解决。

4.实验法:教师引导学生进行实验操作,通过实践来加深对数学知识的理解和应用。

四、教学资源本章节的教学资源主要包括以下几种:1.教材:教师准备相关的数学教材,提供理论知识的学习和练习题的练习。

2.参考书:教师提供相关的参考书籍,供学生进一步深入学习和探索。

3.多媒体资料:教师准备相关的多媒体资料,如图片、视频等,用于辅助讲解和演示。

4.实验设备:教师准备相关的实验设备,供学生进行实验操作和实践。

五、教学评估本章节的教学评估主要包括以下几种方式:1.平时表现:教师通过观察和记录学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和表现。

2.作业:教师通过布置和批改相关的作业,评估学生对知识的理解和应用能力。

3.考试:教师通过安排章节考试或者小测验,评估学生对知识掌握的程度和问题解决的能力。

数据结构实验-农夫过河问题

数据结构实验-农夫过河问题

农夫过河问题一、实验目的掌握广度优先搜索策略,并用队列求解农夫过河问题二、实验内容问题描述:一农夫带着一只狼,一只羊和一颗白菜,身处河的南岸,他要把这些东西全部运到北岸,遗憾的是他只有一只小船,小船只能容下他和一件物品。

这里只能是农夫来撑船,同时因为狼吃羊、羊吃白菜、所以农夫不能留下羊和狼或羊和白菜在河的一边,而自己离开;好在狼属肉食动物,不吃白菜。

农夫怎么才能把所有的东西安全运过河呢?实验要求如下:(1)设计物品位置的表示方法和安全判断算法;(2)设计队列的存储结构并实现队列的基本操作(建立空队列、判空、入队、出队、取对头元素),也可以使用STL中的队列进行代码的编写;(3)采用广度优先策略设计可行的过河算法;(4)输出要求:按照顺序输出一种可行的过河方案;提示:可以使用STL中的队列进行代码编写。

程序运行结果:二进制表示:1111011011100010101100011001,0000三、农夫过河算法流程⏹Step1:初始状态0000入队⏹Step2:当队列不空且没有到达结束状态1111时,循环以下操作:⏹队头状态出队⏹按照农夫一个人走、农夫分别带上三个物品走,循环以下操作:⏹农夫和物品如果在同一岸,则计算新的状态⏹如果新状态是安全的并且是没有处理过的,则更新path[ ],并将新状态入队⏹当状态为1111时,逆向输出path[ ]数组附录一:STL中队列的使用注:队列,可直接用标准模板库(STL)中的队列。

需要#include<queue>STL中的queue,里面的一些成员函数如下(具体可以查找msdn,搜索queue class):front:Returns a reference to the first element at the front of the queue.pop:Removes an element from the front of the queuepush:Adds an element to the back of the queueempty:Tests if the queue is empty三、实验代码FarmerRiver.H#ifndef FARMERRIVER_H#define FARMERRIVER_Hint FarmerOnRight(int status); //农夫,在北岸返回1,否则返回0int WorfOnRight(int status); //狼int CabbageOnRight(int status); //白菜int GoatOnRight(int status); //羊int IsSafe(int status); //判断状态是否安全,安全返回1,否则返回0void FarmerRiver();#endifSeqQueue.h#ifndef SEQQUEUE_H#define SEQQUEUE_Htypedef int DataType;struct Queue{int Max;int f;int r;DataType *elem;};typedef struct Queue *SeqQueue;SeqQueue SetNullQueue_seq(int m);int IsNullQueue_seq(SeqQueue squeue);void EnQueue_seq(SeqQueue squeue, DataType x);void DeQueue_seq(SeqQueue);DataType FrontQueue_seq(SeqQueue);#endifFarmerRiver.c#include <stdio.h>#include <stdlib.h>#include "SeqQueue.h"#include "FarmerRiver.h"int FarmerOnRight(int status) //判断当前状态下农夫是否在北岸{return (0!=(status & 0x08));}int WorfOnRight(int status){return (0!=(status & 0x04));}int CabbageOnRight(int status){return (0!=(status & 0x02));}int GoatOnRight(int status){return (0!=(status & 0x01));}int IsSafe(int status) //判断当前状态是否安全{if ((GoatOnRight(status)==CabbageOnRight(status)) && (GoatOnRight(status)!=FarmerOnRight(status)))return (0); //羊吃白菜if ((GoatOnRight(status)==WorfOnRight(status)) && (GoatOnRight(status)!=FarmerOnRight(status))) return 0; //狼吃羊return 1; //其他状态是安全的}void FarmerRiver(){int i, movers, nowstatus, newstatus;int status[16]; //用于记录已考虑的状态路径SeqQueue moveTo;moveTo = SetNullQueue_seq(20); //创建空列队EnQueue_seq(moveTo, 0x00); //初始状态时所有物品在北岸,初始状态入队for (i=0; i<16; i++) //数组status初始化为-1{status[i] = -1;}status[0] = 0;//队列非空且没有到达结束状态while (!IsNullQueue_seq(moveTo) && (status[15]==-1)){nowstatus = FrontQueue_seq(moveTo); //取队头DeQueue_seq(moveTo);for (movers=1; movers<=8; movers<<=1)//考虑各种物品在同一侧if ((0!=(nowstatus & 0x08)) == (0!=(nowstatus & movers)))//农夫与移动的物品在同一侧{newstatus = nowstatus ^ (0x08 | movers); //计算新状态//如果新状态是安全的且之前没有出现过if (IsSafe(newstatus)&&(status[newstatus] == -1)){status[newstatus] = nowstatus; //记录新状态EnQueue_seq(moveTo, newstatus); //新状态入队}}}//输出经过的状态路径if (status[15]!=-1){printf("The reverse path is: \n");for (nowstatus=15; nowstatus>=0; nowstatus=status[nowstatus]){printf("The nowstatus is: %d\n", nowstatus);if (nowstatus == 0)return;}}elseprintf("No solution.\n");}Sequeue.c#include <stdio.h>#include <stdlib.h>#include "SeqQueue.h"SeqQueue SetNullQueue_seq(int m){SeqQueue squeue;squeue = (SeqQueue)malloc(sizeof(struct Queue));if (squeue==NULL){printf("Alloc failure\n");return NULL;}squeue->elem = (int *)malloc(sizeof(DataType) * m);if (squeue->elem!=NULL){squeue->Max = m;squeue->f = 0;squeue->r = 0;return squeue;}else free(squeue);}int IsNullQueue_seq(SeqQueue squeue){return (squeue->f==squeue->r);}void EnQueue_seq(SeqQueue squeue, DataType x) //入队{if ((squeue->r+1) % squeue->Max==squeue->f) //是否满printf("It is FULL Queue!");else{squeue->elem[squeue->r] = x;squeue->r = (squeue->r+1) % (squeue->Max);}}void DeQueue_seq(SeqQueue squeue) //出队{if (IsNullQueue_seq(squeue))printf("It is empty queue!\n");elsesqueue->f = (squeue->f+1) % (squeue->Max); }DataType FrontQueue_seq(SeqQueue squeue) //求队列元素{if (squeue->f==squeue->r)printf("It is empty queue!\n");elsereturn (squeue->elem[squeue->f]);}main.c#include <stdio.h>#include <stdlib.h>#include "FarmerRiver.h"int main(void){FarmerRiver();return 0;}实验结果:四、实验总结。

农夫过河问题的求解

农夫过河问题的求解
void ListTraverse(LinkType p, status(*visit)(LinkType q));
//从p(P!=NULL)指示的结点开始,依次对每个结点调用函数visit
其中部分操作的伪码算法如下:
BOOL InitList(OrderdeList &L)
{
if(MakeNode(head,ˊˊ)){ //头结点的虚设元素为空格符ˊˊ
{
//分配由p指向的数据元素为e、后继为“空”的结点,并返回TRUE,
//若分配失败,则返回FALSE
p=(Link Type)malloc(sixeof(Node Type));
if(!p)return FALSE;
p->data=e;p->next=NULL; return TRUE;
}
void freeNode(LinkType &p)
//销毁有序链表L
bool Listempty(OrderedList L);
//若L不存在或为“空表”,则返回TRUE,否则返回FALSE
int ListLengty(OrderedList L);
//返回链表的长度
Linktype GetelemPos(OrderedList L, int pos);
构造有序集算法createset读入n个元素逐个用locateelem判定不在当前集合中及确定插入位置后才用insertafetr插入到有序集中所以时间复杂度是on求并集算法union利用集合的有序性将两个集合的个元素不重复地依次利用append插入到当前并集的末尾故可在omn时间内完成
实验报告
题目:编制一个演示农夫过河问题的求解的程序
per=L.head; p=pre->next;

数据结构课程设计报告(农夫过河)

数据结构课程设计报告(农夫过河)

目录引言 (2)1 问题描述 (2)基本要求 (2)2.1为农夫过河问题抽象数据模型体会数据模型在问题求解中的重要性; (2)2.2设计一个算法求解农夫过河问题,并输出过河方案; (2)3 概要设计 (2)3.1数据结构的设计。

(2)3.1.1农夫过河问题的模型化 (2)3.1.2 算法的设计 (3)4、运行与测试 (5)5、总结与心得 (6)附录 (6)参考文献 (12)引言所谓农夫过河问题是指农夫带一只狼、一只羊和一棵白菜在河南岸, 需要安全运到北岸。

一条小船只能容下他和一件物品, 只有农夫能撑船。

问农夫怎么能安全过河, 当然狼吃羊, 羊吃白菜, 农夫不能将这两种或三种物品单独放在河的一侧, 因为没有农夫的照看, 狼就要吃羊, 而羊可能要吃白菜? 这类问题的实质是系统的状态问题, 要寻求的是从初始状态经一系列的安全状态到达系统的终止状态的一条路径。

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

基本要求2.1为农夫过河问题抽象数据模型体会数据模型在问题求解中的重要性;2.2设计一个算法求解农夫过河问题,并输出过河方案;3 概要设计3.1 数据结构的设计。

3.1.1农夫过河问题的模型化分析这类问题会发现以下特征:有一组状态( 如农夫和羊在南, 狼和白菜在北) ; 从一个状态可合法地转到另外几个状态( 如农夫自己过河或农夫带着羊过河) ; 有些状态不安全( 如农夫在北, 其他东西在南) ; 有一个初始状态( 都在南) ; 结束状态集( 这里只有一个, 都在北) 。

问题表示: 需要表示问题中的状态, 农夫等位于南P北( 每个有两种可能) 。

可以采用位向量, 4 个二进制位的0P1 情况表示状态, 显而易见, 共24= 16种可能状态。

从高位到低位分别表示农夫、狼、白菜和羊。

农夫过河报告(最终版)

农夫过河报告(最终版)

农夫过河报告(最终版).12.29Administrator组员:李琦、郑鸿飞、王琅辉、张育博这最起码是一个报告,虽然我摘要农夫过河问题是应用广度优先搜索和深度优先搜索的典型问题,但这里我们应用了简单的数组,通过层层筛选的手段也解决了同样的问题,其中用到了部分广度优先搜索的思想。

前言农夫过河问题描述:一个农夫带着—只狼、一只羊和—棵白菜,身处河的南岸。

他要把这些东西全部运到北岸。

他面前只有一条小船,船只能容下他和—件物品,另外只有农夫才能撑船。

如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不吃白菜。

请求出农夫将所有的东西运过河的方案。

正文1.问题抽象和数据组织农夫过河问题应该应用图的广度优先遍历或者深度优先遍历,但这里我们仅使用简单的线性表——数组,通过多重的条件限制,达成目的。

这里我们同样用0和1代表农夫、狼、羊、白菜在左岸还是在右岸,并规定0在左,1在右,我们的目的便是从0000通过一系列变换到1111。

2.农夫过河算法源代码#include <stdio.h>#define MAX 16typedef struct FWSV{i nt farmer;i nt wolf;i nt sheep;i nt vegetable;}Item;//函数原型//操作:筛选符合条件的安全的数组成员//操作前:无//操作后:返回安全数组的指针void screen(void);//操作:判断下一个数应该取安全数组中那个数//操作前: 传递一个结构体数组成员//操作后:返回另一个结构体数组指针Item * judge(Item Fwsv);Item safe[MAX];int k = 0; //用于计数safe[]中的总数int main (void){s creen();I tem * next;I tem first,second,end;f irst = safe[0];e nd = safe[k];p rintf("first:0000\n");n ext = judge(first);for (int count = 0;count <= 6;count++){if (next->farmer + next->wolf + next->sheep + next->vegetable != 0){second = *next;next = judge(second);}elsenext++;}printf("end:1111\n");r eturn 0;}void screen(void){i nt f = 0,w = 0,s = 0,v = 0;f or(f = 0;f < 2;f++){for(w = 0;w < 2;w++){for(s = 0;s < 2;s++){for(v = 0;v < 2;v++){if (!(f != s && (s == w || s == v))){safe[k].farmer = f;s afe[k].wolf = w;s afe[k].sheep = s;safe[k].vegetable = v;k++;}}}}}}Item * judge(Item Fwsv){I tem * next;Item compare[4];n ext = compare;i nt x1 = 0;i nt sum = 0;i f (Fwsv.farmer == 0){for (int x = 0;x < k;x++){//把出现过的置零操作if(safe[x].farmer == Fwsv.farmer && safe[x].wolf == Fwsv.wolf && safe[x].sheep == Fwsv.sheep && safe[x].vegetable == Fwsv.vegetable ){safe[x].farmer = 0;safe[x].wolf = 0;safe[x].sheep = 0;safe[x].vegetable = 0;}//筛选出农夫状态值与之前相反的1变0 0变1if(safe[x].farmer == 1 && (safe[x].farmer + safe[x].wolf + safe[x].sheep + safe[x].vegetable != 4 )) {compare[x1] = safe[x];x1++;}}for (int x2 = 0;x2 < 4;x2++){//删除状态值与农夫不同但是改变了的sum = Fwsv.farmer + Fwsv.wolf + Fwsv.sheep + Fwsv.vegetable;if ((Fwsv.farmer != Fwsv.wolf && compare[x2].wolf != Fwsv.wolf)||(Fwsv.farmer != Fwsv.sheep && compare[x2].sheep != Fwsv.sheep)|| (Fwsv.farmer != Fwsv.vegetable && compare[x2].vegetable != Fwsv.vegetable)|| (Fwsv.farmer != Fwsv.vegetable && compare[x2].vegetable != Fwsv.vegetable)){compare[x2].farmer = 0;compare[x2].wolf = 0;compare[x2].sheep = 0;compare[x2].vegetable = 0;}sum+=2;//对和的限制if(compare[x2].farmer + compare[x2].wolf + compare[x2].sheep + compare[x2].vegetable != sum){compare[x2].farmer = 0;compare[x2].wolf = 0;compare[x2].sheep = 0;compare[x2].vegetable = 0;}}printf("-----------------------------------------\n");for(int x3 = 0;x3 < 4;x3++){if (compare[x3].farmer + compare[x3].wolf + compare[x3].sheep + compare[x3].vegetable != 0){printf("上数与:%d%d%d%d相连\n",c ompare[x3].farmer,compare[x3].wolf,c ompare[x3].sheep,compare[x3].vegetabl );}}}i f (Fwsv.farmer == 1){for (int y = 0;y < k;y++){if(safe[y].farmer == Fwsv.farmer && safe[y].wolf == Fwsv.wolf && safe[y].sheep == Fwsv.sheep && safe[y].vegetable == Fwsv.vegetable ){safe[y].farmer = 0;safe[y].wolf = 0;safe[y].sheep = 0;safe[y].vegetable = 0;}if(safe[y].farmer == 0 && (safe[y].farmer + safe[y].wolf + safe[y].sheep + safe[y].vegetable != 0 )) {compare[x1] = safe[y];x1++;}}for (int x2 = 0;x2 < 4;x2++){sum = Fwsv.farmer + Fwsv.wolf + Fwsv.sheep + Fwsv.vegetable;if ((Fwsv.farmer != Fwsv.wolf && compare[x2].wolf != Fwsv.wolf)||(Fwsv.farmer != Fwsv.sheep && compare[x2].sheep != Fwsv.sheep)|| (Fwsv.farmer != Fwsv.vegetable && compare[x2].vegetable != Fwsv.vegetable)|| (Fwsv.farmer != Fwsv.vegetable && compare[x2].vegetable != Fwsv.vegetable)){compare[x2].farmer = 0;compare[x2].wolf = 0;compare[x2].sheep = 0;compare[x2].vegetable = 0;}}printf("-----------------------------------------\n");for(int x3 = 0;x3 < 4;x3++){if (compare[x3].farmer + compare[x3].wolf + compare[x3].sheep + compare[x3].vegetable != 0){printf("上数与:%d%d%d%d相连\n",compare[x3].farmer,compare[x3].wolf,com pare[x3].sheep,compare[x3].vegetable );}}r eturn next;}3.算法功能说明和流程描述首先我们定义了一个结构体Itemtypedef struct FWSV{int farmer;int wolf;int sheep;int vegetable;}Item;Item中包含了农夫(farmer),狼(wolf),羊(sheep),白菜(vegetable),用来表示农夫、狼、羊、白菜的状态,并作出规定当为0的时候表示在左岸,当为1的时候表示在右岸,我们的目标便是从0000的状态到1111的状态。

农夫过河实验报告——数据结构

农夫过河实验报告——数据结构

数据结构实验报告——实验四农夫过河的求解本实验的目的是进一步理解顺序表和队列的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。

一、【问题描述】一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸。

他要把这些东西全部运到北岸。

他面前只有一条小船,船只能容下他和一件物品,另外只有农夫才能撑船。

如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不吃白菜。

请求出农夫将所有的东西运过河的方案。

二、【数据结构设计】求解这个问题的简单的方法是一步一步进行试探,每一步搜索所有可能的选择,对前一步合适的选择再考虑下一步的各种方案。

要模拟农夫过河问题,首先需要对问题中每个角色的位置进行描述。

一个很方便的办法是用四位二进制数顺序分别表示农夫、狼、白菜和羊的位置。

用0表示农夫或者某东西在河的南岸,1表示在河的北岸。

例如整数5(其二进制表示为0101) 表示农夫和白菜在河的南岸,而狼和羊在北岸。

现在问题变成:从初始状态二进制0000(全部在河的南岸) 出发,寻找一种全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸)为最终目标,并且在序列中的每一个状态都可以从前一状态到达。

为避免瞎费功夫,要求在序列中不出现重复的状态。

实现上述求解的搜索过程可以采用两种不同的策略:一种是广度优先(breadth_first) 搜索,另一种是深度优先(depth_first) 搜索。

本书只介绍在广度优先搜索方法中采用的数据结构设计。

广度优先就是在搜索过程中总是首先搜索下面一步的所有可能状态,再进一步考虑更后面的各种情况。

要实现广度优先搜索,可以使用队列。

把下一步所有可能的状态都列举出来,放在队列中,再顺序取出来分别进行处理,处理过程中把再下一步的状态放在队列里……。

由于队列的操作遵循先进先出的原则,在这个处理过程中,只有在前一步的所有情况都处理完后,才能开始后面一步各情况的处理。

趣味数学教案—农夫过河

趣味数学教案—农夫过河

趣味数学教案—农夫过河-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN农夫过河教学目标1、知识与能力:通过农夫过河的数学逻辑问的题,探讨研究找到解决问题的办法和养成自己动脑动手的解决问题的能力。

2、过程与方法:通过以角色扮演的形式让学生自己动脑动手寻找答案和探讨解决问题的方法。

3、态度价值观:知道数学有很多有趣的东西,培养爱科学的情感。

教师准备1. 数学课件。

2、做“狼、羊、白菜、农夫”头饰。

3、准备四张纸分别写上“狼、羊、白菜、农夫”。

教学过程一、谈话导入介绍我国著名的数学家华罗庚爷爷。

数学家华罗庚生平介绍,主要科学业绩,对数学的贡献等等。

介绍华罗庚爷爷的话。

“数学本身,也是无穷的美妙,认为数学枯燥,是不正确的,就像站在花园外面,说花园枯燥无味一样,只要你踏进大门,随时会发现数学有许多有趣的东西。

”数学并不是几个数字算来算去,它的学问大着呢。

下面这道题能引起你的兴趣吗?二、创设情境1、出示数学问题:有一个农夫带一匹狼、一只羊和一棵白菜过河(从河的东岸到西岸)。

如果没有农夫看管,则狼要吃羊,羊要吃白菜。

但是船很小,只够农夫带一样东西过河。

2、图片演示。

(一条河;一边是对岸;另一边是河岸,有农夫、狼、羊、白菜)三、探究学习1、以小组表演形式(演示出河的位置)和讨论形式解题第一步是什么必须是什么(农夫和羊先过河)第二步是什么(农夫自己回来)第三步是什么2、全班学生汇报交流问题的突破口在——狼与白菜能够共存!农夫、狼、羊、白菜和船组成了这个系统。

系统中各要素是一个整体,都依赖农夫过河;最大的问题是“船很小,只够农夫带一样东西过河”和“没有农夫看管,则狼要吃羊,羊要吃白菜”的冲突。

我们联系已知条件,做了一系列的分析实验,但是比较其他方案不能实现所有要素都安全过河。

最后得出以上方案。

具体描述如下:第一步:把羊带过河,坐船返回;第二步:把狼带过河,带羊返回;第三步:将羊放在这一岸后,带白菜过河;第四步:坐船返回,把羊带过河。

农夫过河和骑士周游

农夫过河和骑士周游

1:实验要求实验目的掌握图的遍历问题,运用图的遍历算法解决复杂问题。

掌握并应用邻接存储结构和图的深度遍历问题。

培养学习使用图的相关知识解决实际问题的能力。

实验内容问题描述问题描述:农夫携带一只狼,一只羊,一棵白菜从和的左岸到达河的右岸,由于船只较小,农夫每次只能携带一样过河,在无人看管的情况下狼吃羊,羊吃白菜。

:实验输出要求要求输出农夫携带所有东西安全过河的步骤。

2:程序设计分析:实验内容分析农夫需要多次驾船往返于河的左右两岸,农夫每次过河都会使农夫,狼,羊,白菜的位置发生变化。

利用四元组(农夫,狼,羊,白菜)来表示各自所处于河的左岸右岸的位置,0表示河的左岸,1表示河的右岸。

初始状态时(0,0,0,0)都处在河的左岸,终态是(1,1,1,1)四者都处在河的右岸。

共有16种状态,但其中有些状态不安全,删除不安全的状态,将安全的状态按照合理的过河步骤联系起来.(0,0,0,0)(1,0,1,0)(0,0,1,0)(1,1,1,0) (1,0,1,1)(0,1,0,0) (0,0,0,1)(1,1,0,1)(0,1,0,1)(1,1,1,1)安全过河状态图主要函数模块算法分析1:栈的相关函数PSeqStack Init_SeqStack(void) armer,G->vertex[k].wolf,G->vertex[k].sheep,G->vertex[k].vegetable);m=CountAdjoin(G,k);if(m==0) armer,G->vertex[t].wolf,G->vertex[t].sheep,G->vertex[t].vegetable);a=t;t=path[t][1];visited[t]=FALSE;n++;}elsebreak;}printf("\n");}j=l;k=a;}k=path[k][1];}}3:实验结果结果分析:农夫过河的安全步骤:NO1:农夫,狼,羊,白菜都在河的左岸NO2:农夫带羊到河的右岸NO3:农夫回到河的左岸NO4:农夫带狼到河的右岸或者农夫带白菜到河的右岸NO5:农夫带羊回到河的左岸或者农夫带羊回到河的左岸NO6:农夫带狼到河的右岸NO7:农夫回到河的左岸NO8:农夫带羊到和的右岸4:实验心得通过农夫过河的实验,使我初步了解解决一些复杂较难问题的思路和掌握了解决问题的方法。

prolog实验报告

prolog实验报告

华北电力大学实验报告||实验名称PROLOG语言编程练习及图搜索问题求解课程名称人工智能及应用专业班级:学生姓名:学号:成绩:指导教师:实验日期:2014年5月(实验报告如打印,纸张用A4,左装订;页边距:上下2.5cm,左2.9cm, 右2.1cm;字体:宋体小四号,1.25倍行距。

)验证性、综合性实验报告应含的主要内容:一、实验目的及要求二、所用仪器、设备三、实验原理四、实验方法与步骤五、实验结果与数据处理六、讨论与结论(对实验现象、实验故障及处理方法、实验中存在的问题等进行分析和讨论,对实验的进一步想法或改进意见)七、所附实验输出的结果或数据设计性实验报告应含的主要内容:一、设计要求二、选择的方案三、所用仪器、设备四、实验方法与步骤五、实验结果与数据处理六、结论(依据“设计要求”)七、所附实验输出的结果或数据reverse_writelist([H|T]):-reverse_writelist(T),write(H),nl.empty_stack([]).stack(Top,Stack,[Top|Stack]).reverse_print_stack(Stack):-empty_stack(Stack).reverse_print_stack(Stack):-stack(E,Rest,Stack),reverse_print_stack(Rest),write(E),nl.member(X,[X|T]).member(X,[_|T]):-member(X,T).member_stack(Element,Stack):-member(Element,Stack).go(Start,Goal):-empty_stack(Empty_been_stack),stack(Start, Empty_been_stack, Been_stack),path(Start, Goal, Been_stack).test:-go(state(w,w,w,w), state(e,e,e,e)).六、讨论与结论Prlolg的求解过程就是一个不断通过规则进行匹配,最后匹配到事实后回溯得出解的过程。

农夫过河 实验报告

农夫过河 实验报告

农夫过河实验报告
实验报告:农夫过河
实验目的:
1. 了解农夫过河问题的规则和约束条件;
2. 分析农夫过河问题的求解思路;
3. 实现农夫过河问题的求解算法。

实验原理:
农夫过河问题是一种经典的逻辑推理问题,涉及农夫、狼、羊和菜四个角色过河的情景。

根据约束条件,农夫每次只能带一种物品过河,而且农夫不能将狼和羊、羊和菜同时留在岸边,否则会发生危险。

实验步骤:
1. 设计数据结构表示问题的状态,如使用二进制位表示农夫、狼、羊和菜的位置;
2. 使用递归算法实现问题的解法,通过深度优先搜索遍历所有可能的状态,并根据约束条件进行剪枝;
3. 运行程序,输出农夫过河的解答序列。

实验结果:
根据实验步骤中的算法和程序设计,成功地求解了农夫过河问题,并输出了正确的解答序列。

实验结果表明,农夫可以经过
一系列合法的操作,将狼、羊和菜都安全地带过河。

实验结论:
通过本次实验,我们深入理解了农夫过河问题的规则和约束条件,并成功地实现了问题的求解算法。

实验结果表明,农夫过河问题有多种可能的解法,但只有符合约束条件的解才是正确的解答。

这个经典的逻辑推理问题在计算机科学中具有重要的意义,可以用于教学和娱乐等领域。

过河问题实验报告

过河问题实验报告

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 (i == -1) { search(Step + 1); }
else if (a[Step][i] == a[Step][3]) {
a[Step + 1][i] = a[Step + 1][3]; search(Step + 1); } } 每次循环从-1 到 2 依次代表农夫渡河时为一人、带狼、带羊、带白菜通过, 利用语句 “b[Step] = i”分别记录每一步中农夫的渡河方式,“a[Step + 1][i] = a[Step + 1][3]”即利用赋值方式使该项与农夫一同到对岸或者回到本岸。若 渡河成功,则依次输出渡河方式。 “i <= 2”即递归操作的界限,当若 i=2 时 仍无符合条件的方式,则渡河失败。
east east east
east east
: farmer goat wolf cabbage west : none
The 1 time
: wolf cabbage
west : farmer goat
------ farmer
: farmer wolf cabbage

农夫过河数据结构

农夫过河数据结构

农夫过河数据结构郑州轻工业学院课程设计任务书题目农夫过河专业、班级计算机科学与技术学号姓名主要内容:一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸,要把这些东西全部运到北岸。

他面前只有一条小船,船只能容下他和一件物品,另外只有农夫才能撑船。

如果农夫在场,则狼不能吃羊,羊不能吃白菜;否则狼会吃羊,羊会吃白菜。

所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不能吃白菜。

要求给出农夫将所有的东西运过河的方案。

基本要求:编写求解该问题的算法程序,并用此程序上机运行、调试,屏幕显示结果,能结合程序进行分析。

主要参考资料:数据结构严蔚敏完成期限: 2012/6/21指导教师签名:课程负责人签名:年月日郑州轻工业学院本科数据结构课程设计总结报告设计题目:农夫过河学生姓名:系别:计算机与通信工程学院专业:计算机科学与技术班级:计算机科学与技术学号:指导教师:2012年 6 月 21 日2一,设计题目问题描述:一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸,他要把这些东西全部运到北岸。

他面前只有一条小船,船只能容下他和一件物品,另外只有农夫才能撑船。

如果农夫在场,则狼不能吃羊,羊不能吃白菜;否则狼会吃羊,羊会吃白菜。

所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不能吃白菜。

要求给出农夫将所有的东西运过河的方案。

二,运行环境(软、硬件环境)VC6.0 Windows7系统三,算法设计的思想对于这个问题,我们需要先自动生成图的邻接矩阵来存储,主要方法是先生成各种安全状态结点,存放在顶点向量中;再根据判断两个结点间状态是否可以转换来形成顶点之间的所有边,并把它们保存在邻接矩阵中。

在建立了图的邻接矩阵存储结构后,利用递归深度优先搜索求出从顶点(0,0,0,0)到顶点(1,1,1,1)的一条简单路径,这样做只能搜到一种合理方法,因为深度优先搜索遍历一个图的时候每一个结点只能被访问一次。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。





图2确定状态的安全有效性的功能模块设计算法流程图
(3)输出模块设计
输出农夫过河问题的可行性方案时,可从目标状态(1111)开始,将其记入队列(或栈)中,然后再找出其前驱,记入队列(或栈)中,然后在找其前驱,…,直到找到的是开始状态(0000)为止。要求输出时根据位置分布代码(即4位二进制数)各个位置上的0、1代码所表示的含义输出容易理解的文字。
“数据结构与算法综合实验”课程设计报告
题目:
农夫过河问题
学院
计算机科学技术
年级
2014级
专业
计算机科学与技术
学号
20142060
姓名
高晗
日期
2016年3月30日星期三
成绩
评语
大学
计算机科学技术学院、软件学院
《数据结构与算法综合实验》报告
1.系统概述
(1)一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸,他要把这些东西全部运到北岸。他面前只有一只小船,船只能容下他和一件物品,另外只有农夫才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜;否则狼会吃羊,羊会吃白菜。所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,但是狼不吃白菜。要求给出农夫将所有东西运过河的方案。
x
图1系统状态转换结构图
(2)软件结构设计
农夫过河管理系统根据需求分析中的功能分析,可以提炼出主要有搜索功能,判断事物安全功能,输出过河方案功能。而搜索功能又可以利用不同算法,如广度优先算法,深度优先算法等等。判断事物安全功能需要将事物位置进行分析,通过位置分布的代码来判断当前状态是否安全,使用“与”位操作来考察狼和羊、羊和白菜是否在同一侧,且它们与农夫不一侧。若是,该状态即为不安全状态,否则为安全状态。若一个状态已经被访问过,或只有农夫一人从南岸过到北岸,则该状态被判为无效状态。输出功能就是将过河方案在屏幕上进行显示。系统软件结构如图1所示
(2)确定状态的安全有效性的功能模块设计
通过位置分布的代码来判断当前状态是否安全,使用“与”位操作来考察狼和羊、羊和白菜是否在同一侧,且它们与农夫不一侧。若是,该状态即为不安全状态,否则为安全状态。若一个状态已经被访问过,或只有农夫一人从南岸过到北岸,则该状态被判为无效状态。若状态安全且有效,则返回1,否则返回0。该模块算法流程图如图2所示。
5.系统测试
对于该程序而言并没有实际输入,需要观察的就是输出结果。对于该程序的测试及其测试用例如表3所示。
表3输出测试用例
测试容
测试用例
预期结果
实际结果
输出过河方案具体步骤

第0步:南岸农夫狼白菜羊
北岸
第1步:南岸狼白菜
北岸农夫羊
第2步:南岸农夫狼白菜
北岸羊
第3步:南岸狼
北岸农夫羊白菜
第4步:南岸农夫狼羊
用一个整数队列MoveTo把搜索过程中所有可能达到的状态都保存起来。队列中的每一个元素表示一个可以到达的中间状态。另外用一个整数数组route记录被访问过的状态,以及已经被发现的能够到达这些状态的前驱。数组只需使用16个元素,每个元素的初始化值均为-1,每当队列中加入一个新状态时,数组中以该状态做下标的元素改为到达这一状态的前一状态的下标值。所以数组的第i个元素不仅记录状态i是否被过,同时还保存该状态的前驱状态下标。算法结束后可以利用route数组元素的值生成一个正确的状态路径。系统状态转换结构如图1所示:
参考文献
[1]严蔚敏,冬梅,吴伟民.数据结构(C语言版)[M].:人民邮电,2011:54-110.
附录
1.广度优先算法
#include<iostream>
#include<cstdlib>
#define MAXNUM 20
using namespace std;
typedef struct //顺序队列类型定义
(2)为农夫过河问题抽象数据模型,体会数据模型在求解问题中的重要作用。
(3)掌握顺序表和队列的逻辑结构和存储结构。
2.系统需求分析
(1)针对实现整个过程需要多步,不同步骤中各个事物所处位置不同的情况,可定义一个结构体来实现对四个对象狼、羊、白菜和农夫的表示。对于起始岸和目的岸,可以用0或者1来表示,以实现在程序设计中的简便性。
输出界面要求具有每一步中农夫所带对象及每步之后各岸的物体,需要定义不同的数组来分别存储上述容,并使界面所示方案清晰简洁。
(4)实验运行环境为VC++6.0.
3.系统概要设计
(1)数据结构设计
要模拟农夫过河的问题,用四位二进制数顺序分别表示农夫,狼,羊,白菜的位置。用0表示农夫或某种东西在河的南岸,1表示在河的北岸。则问题的初始状态是整数(二进制数表示为0000);问题的终结状态是整数15(二进制表示为1111)。
图1农夫过河管理系统软件模块结构图
4.系统详细设计与实现
(1)搜索算法设计
搜索过程可利用广度优先搜索算法从初始状态二进制0000(全部在河的南岸)出发,寻找一种全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸)为最终目标,并且在序列中的每一个状态都可以从前一个状态得到。为避免重复,要求在序列中不出现重复的状态。
{
int f, r; //f表示头,r表示尾
int q[MAXNUM];//顺序队
}SqQueue ,*SqQueuePtr;
SqQueuePtr createEmptySQueue()//创建空队列
{
SqQueuePtr squeue = new SqQueue;
(2)题目要求给出四种事物的过河步骤,没有对先后顺序进行约束,这就需要给各个事物依次进行编号,然后依次试探,若试探成功,进行下一步试探。这就需要使用循环或者ห้องสมุดไป่ตู้归算法,避免随机盲目运算且保证每种情况均试探到,不接受非法输入。
(3)题目要求求出农夫带一只羊,一条狼和一颗白菜过河的办法,所以依次成功返回运算结果后,需要继续运算,直至求出结果,即给出农夫的过河方案。
北岸白菜
第5步:南岸羊
北岸农夫狼白菜
第6步:南岸农夫羊
北岸狼白菜
第7步:南岸
北岸农夫狼白菜羊
与预期结果相同
6.小结
(1)通过这2周的程序设计使我了解到了自己在数据结构方面的不足,也坚定了我学好编程的信心。
(2)采用广度优先的算法,利用数组只能记寻前一个前驱,导致另一个路径的丢失,不是很令人满意,所以采用第二种算法,深度优先算法,利用栈来记录路径前驱。
相关文档
最新文档