欢迎来到天天文库
浏览记录
ID:50944690
大小:47.00 KB
页数:4页
时间:2020-03-16
《农夫过河问题(c++编写).doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、1、问题描述从前,一个农夫带着一只狼,一只羊和一棵白菜要河(注意该狼被农夫训服了,但还会吃羊)。他要将所有东西安全的带到河的对岸,不幸的是河边只有一条船,只能装下农夫和他的一样东西,并且农夫必须每次都随船过,因为只有他能撑船。在无人看管的情况下,狼要吃羊,羊要吃白菜,因此,农夫不能在河的某边岸上单独留下狼和羊,也不能单独留下羊和白菜。那么农夫如何才能使三样东西平安过河呢?2、需求分析1)、农夫必须把狼,羊,白菜全部都载过河,且一次只能载一个;2)、要求狼和羊不能单独在一起,羊和白菜也不能单独在一起,即要么羊单独在河的一边,要么羊和农夫在一起。3、系统概述设计对
2、于上述情况,可以将河的两岸抽象成成数学问题,即将河的本岸抽象成数字‘0’,将对岸抽象成‘1’;且将狼,羊,白菜,农夫,分别抽象成数字‘0’,‘1’,‘2’,‘3’。而用数组a[i][j](取值只能为0和1)表示第i次运载是,j(j=0,1,2,3。分别表示狼,羊,白菜,农夫)所在的位置。而用b[i]表示第i次运载时船上运载的东西(因为农夫每次都必须在船上,所以不用记录,除非穿上只有农夫一人)。如此一来,是否全部过河的问题就转化为判断a[i][0],a[i][1],a[i][2],a[i][3]是否全为1了,即相加之和是否为4的问题了;而四者中的两者是否能在一起
3、的问题就转化它们各自的a[i][j]是否相等的问题了。4、系统详细设计创建一个数组a[MAXTIMES][4]用于存放农夫,狼,羊,白菜的位置,用0表示本岸,1表示对岸;b[MAXTIMES]用于存放狼,羊,白菜,农夫的编号;0:狼,1:羊,2:白菜,3:农夫;编写一个递归函数Ferry(intferryTimes),其中ferryTimes为渡河次数,在函数中,应考虑3个问题:1)、用a[ferryTimes][0]+a[ferryTimes][1]+a[ferryTimes][2]+a[ferryTimes][3]==4语句判断是否全部到达对岸,如果是,则
4、直接输出结果,否则,考虑第二个问题;2)、狼和羊是否单独在一起,羊和白菜是否单独在一起,用语句a[ferryTimes][1]!=a[ferryTimes][3]&&(a[ferryTimes][2]==a[ferryTimes][1]
5、
6、a[ferryTimes][0]==a[ferryTimes][1])来实现;3)、如果上两个条件都不满,则可执行运输的动作,但每次都应考虑,该运输情况以前是否执行过(即两岸以及船上的东西以及各自位置和以前完全相同),如果没被执行过,则可以保存此时四者各自的状态,并递归的进行下一次运载。5、系统测试6、经验总结解决实际问题时
7、,应先分析实际问题,找出实际问题的所有约束条件,然后对问题进行数学模型的抽象化,抓主要因素,省去一些不需要的因素,将其抽象为数学问题,然后再从整体上设计算法,搭建程序的框架,最后一步步完善细节,这样做,会使本来毫无头绪的问题变得清晰起来。7、参考文献《C++程序设计》《数据结构》《算法设计与分析》程序代码如下:#include#include#includeusingnamespacestd;constintMAXTIMES=20;inta[MAXTIMES][4];//存放农夫,狼,羊,白菜的位置,
8、用0表示本岸,1表示对岸char*name[]={"狼","羊","白菜","农夫自己"};intb[MAXTIMES];//用于存放狼,羊,白菜,农夫的编号;0:狼,1:羊,2:白菜,3:农夫voidFerry(intferryTimes)//ferryTimes为渡河次数{inti;if(a[ferryTimes][0]+a[ferryTimes][1]+a[ferryTimes][2]+a[ferryTimes][3]==4)//都到达对岸{for(i=0;i9、10、11、a[ferryTimes][0]==a[ferryTimes][1])){return;}//用于判断此种情况在前searchTimes次运载过程中是否已经出现过,若出现过则不用记12、录for(i=0;i
9、10、11、a[ferryTimes][0]==a[ferryTimes][1])){return;}//用于判断此种情况在前searchTimes次运载过程中是否已经出现过,若出现过则不用记12、录for(i=0;i
10、
11、a[ferryTimes][0]==a[ferryTimes][1])){return;}//用于判断此种情况在前searchTimes次运载过程中是否已经出现过,若出现过则不用记
12、录for(i=0;i
此文档下载收益归作者所有