农夫过河

合集下载

农夫过河

农夫过河

1.农夫过河从前,一个农夫带了一只狗,一只兔子和一颗白菜过河。

在河边,那仅有一只很小的旧船,农夫最多只能带其中的一样东西上船,否则就会有沉船的危险。

可是,农夫如果把白菜带上船的话,调皮的狗就会欺负弱小的兔子,如果把狗带上船的话,贪吃的兔子会把白菜吃掉。

农夫在河边想了很久,终于想出了一个办法。

老师们,你知道农夫是怎样做到的吗?2.瓶子的价格姐妹俩在逛街。

在一个精品店里,她们看见了一个五角星形状的瓶子,都很想买下来,但是手里的钱都不够。

姐姐缺了4.25元钱,妹妹缺了0.01元钱,于是她们就决定俩个人同时买一个。

可是,姐妹俩的钱加起来还是不够。

老师们,你知道这是为什么吗?3.谁偷吃了生日蛋糕蓬蓬今天过生日,妈妈送了她一个大蛋糕。

拿着蛋糕,蓬蓬计划着该和谁来分享。

可是,她上完体育课回来,蛋糕却被人偷吃了。

蓬蓬生气极了,于是,她问了留在教室的四个人,却得到了下面的答案:明明说:“红红吃了蛋糕。

”红红说:“画画吃了蛋糕。

”小游说:“我没有吃。

”画画说:“红红说谎。

”他们当中,只有一个人说了真话,其余的人都在说谎,可是偷吃蛋糕的只有一个人,你知道到底是谁偷吃了蛋糕呢?4.牧马人的马有一个牧马人要去关外送货,为了分清楚马的顺序,他就会在马的身上烙上有序号的火印。

但是再盖火印的时候,马会因为疼痛而嘶叫,每在一只马上烙一个印,马就会叫十分钟,十分钟后,疼痛减轻了,马也就不叫了。

这个牧马人一共有11匹马,假设马的叫声没有重叠,牧马人要听多长时间的马叫声?5.蜗牛出井蜗牛在井边玩,不小心掉到了井里。

它很想沿着井壁爬上来,但井底之蛙说:“你就在这里呆着吧,井有10米深,你是爬不出去的。

”蜗牛心想:我才不要呆在井底,整天就看井口大的天空,我要爬上去。

于是它看是攀爬井壁,每爬一天,就上升3米,但每次上升前,会落下2米。

老师们,你也给蜗牛打打气,告诉它一共要几天才能出来呢?6.烤饼花的时间爸爸妈妈今天都要外出,一早就要小优帮他们准备早餐。

课程设计农夫过河

课程设计农夫过河

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

题目 流程农夫过河

题目 流程农夫过河

题目流程农夫过河一、基础过河规则类题目(1 - 5题)题目1:农夫带着狼、羊和一筐白菜要过河。

只有一条小船,农夫每次只能带一样东西过河。

如果农夫不在,狼会吃羊,羊会吃白菜。

请问农夫怎样才能安全地把狼、羊和白菜都运到河对岸?解析:1. 农夫先把羊运到河对岸,然后农夫独自返回。

- 原因是狼不吃白菜,这样河这边留下狼和白菜是安全的。

2. 农夫再把狼运到河对岸,然后农夫带着羊返回。

- 因为如果不把羊带回来,狼会吃羊。

3. 农夫把白菜运到河对岸,然后农夫独自返回。

- 此时河对岸有狼和白菜,是安全的。

4. 最后农夫把羊运到河对岸。

题目2:农夫要带狐狸、鸡和一袋米过河。

船很小,农夫每次只能带一个东西过河。

如果农夫不在,狐狸会吃鸡,鸡会吃米。

农夫应该怎样安排过河顺序?解析:1. 农夫先把鸡运到河对岸,然后农夫独自返回。

- 这样河这边留下狐狸和米是安全的。

2. 农夫再把狐狸运到河对岸,然后农夫带着鸡返回。

- 防止狐狸吃鸡。

3. 农夫把米运到河对岸,然后农夫独自返回。

- 此时河对岸有狐狸和米,安全。

4. 最后农夫把鸡运到河对岸。

题目3:农夫带着狗、兔子和一篮胡萝卜过河。

船只能载农夫和一样东西。

若农夫不在,狗会咬兔子,兔子会吃胡萝卜。

怎样安全过河?解析:1. 农夫先带兔子过河,然后独自返回。

- 因为狗不吃胡萝卜,这样河这边狗和胡萝卜是安全的。

2. 农夫再带狗过河,然后带兔子返回。

- 避免狗咬兔子。

3. 农夫带胡萝卜过河,然后独自返回。

- 此时河对岸狗和胡萝卜安全。

4. 最后农夫带兔子过河。

题目4:有个农夫要带蛇、鼠和一袋谷子过河,船每次只能载农夫和一样东西。

农夫不在时,蛇会吃鼠,鼠会吃谷子。

如何安全渡河?解析:1. 农夫先带鼠过河,然后独自返回。

- 此时河这边蛇和谷子是安全的。

2. 农夫再带蛇过河,然后带鼠返回。

- 防止蛇吃鼠。

3. 农夫带谷子过河,然后独自返回。

- 河对岸蛇和谷子安全。

4. 最后农夫带鼠过河。

题目5:农夫带着猫、鱼和一盆花过河。

农夫过河问题

农夫过河问题

农夫过河问题
一、先分析农夫过河的情景:1.他走到了小桥上,遇见了大象;2.他看见小桥很窄,不能通过大象,于是下来,又看见了小兔子;3.小兔子让他再回去把自己带来的萝卜给小猴子送去;4.他想了想,就决定去找乌龟帮忙。

二、农夫为什么要这样做?我们可以用图中所示的几种方法来解答:(1)如果你是农夫,你会怎么办呢?(2)我们在学习时也常常有这样的问题,面对某个复杂的问题,总是从多角度考虑它,然后得出最佳的解决方案。

比如我们要学好数学,需要同学之间互相讨论交流,取长补短,共同进步。

三、根据刚才提供的信息和已经确立的条件,你认为哪些条件更重要?请写出两点理由并说明原因。

四、结合生活实际谈谈应该怎样正确处理人与人之间的关系。

宽搜农夫过河问题

宽搜农夫过河问题

农夫过河问题宽搜(bfs)算法详解农夫过河问题(农夫、狼、羊和白菜的问题),描述如下:一个农夫,带着一只狼、一只羊、和一棵白菜,身处河的南岸,他要把这些东西全部运到北岸。

农夫的面前有一条小船,船小到只能容下他和一件物件。

另外,只能农夫会撑船。

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

但狼属于食肉动物,不吃白菜。

问农夫采取什么方案才能将所有的东西运过河?解题思路农夫过河问题的求解方法是使用广度优先搜索(BFS),即在搜索过程中总是最先搜索下面一步的所有可能状态,然后再进行考虑更后面的各种情况。

要实现广度优先搜索,一般采用队列结构。

把下一步所有可能达到的状态都列举出来,放在这个队列中,然后顺序取出来分别对其进行处理,处理过程中再把下一步的状态放在队列里。

在采用编程解决农夫过河的问题时,首先需要考虑以下几个问题:•程序中为了方便描述农夫过河过程中几个角色的位置(位于南岸还是北岸),最好的方法是用4 个二进制数,分别顺序表示农夫、狼、白菜和羊的位置。

在本节程序中,用二进制0 表示某角色在河的南岸,用 1 表示某角色在河的北岸。

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

•为了方便获取各个角色当前所在的位置,程序中设置了如下 4 个函数。

其中,函数返回值为1,反之则表示角色在河的北岸://表示农夫状态的函数,返回0 ,表示农夫在南岸,反之在北岸。

int farmer(int location){return(0!=(location & 0x08));}//表示狼的状态的函数,返回0 ,表示农夫在南岸,反之在北岸int wolf(int location){return(0!=(location & 0x04));}//表示白菜状态的函数,返回0 ,表示农夫在南岸,反之在北岸int cabbage(int location){return(0!=(location & 0x02));}//表示羊状态的函数,返回0 ,表示农夫在南岸,反之在北岸int goat(int location){return(0!=(location & 0x01));}其中,location 为当前4 种角色所处的状态,其值为0(0000)到15(1111)之间的数。

农夫过河问题

农夫过河问题

问题一:农夫,狐狸,鹅和麦粒过河问题。

他们都在河的左岸,现在要全部到对岸去,农夫有一条船,过河时,除农夫外,船上至多能载一样东西,狐狸要吃鹅,鹅要吃麦粒,除非农夫在那里。

规划出确保全部安全的过河方案。

解:用四元组(农夫,狐狸,鹅,麦粒)表示状态,其中每个元素都可为0或1。

0表示在左岸,用1表示在右岸。

用四元组(f、w、s、g)表示状态, f 代表农夫,w 代表狐狸,s 代表鹅,g 代表麦粒
初始状态S0:(0,0,0,0)目标状态:(1,1,1,1)
不合法状态有:(1,0,0,*),(1,*,0,0),(0,1,1,*),(0,*,1,1)
操作集F={p1,p2,p3,p4,q0,q1,q2,q3 }
首先分析如图所示:
操作符条件动作
p1 f=0,w=0f=1,w=1
s和g相异
p2 f=0,s=0 f=1,s=1
p3 f=0,g=0 f=1,g=1
w和s相异
q0 f=1 f=0
s和g相异
w和s相异
q1 f=1,w=1f=0,w=0
s和g相异
q2 f=1,s=1 f=0,s=0
q3 f=1,g=1 f=0,g=0
w和s相异
所以,方案有两种:
p2→ q0 → p3→ q2 → p2 → q0 → p2 p2→ q0 → p1→ q2 → p3→ q0→ p2。

农夫过河报告(最终版)

农夫过河报告(最终版)

农夫过河报告(最终版).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的状态。

趣味数学教案—农夫过河

趣味数学教案—农夫过河

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

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

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

教师准备1. 数学课件。

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

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

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

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

介绍华罗庚爷爷的话。

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

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

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

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

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

2、图片演示。

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

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

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

最后得出以上方案。

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

农夫过河问题

农夫过河问题

农夫过河问题1. 题目描述:一个农夫带着一只狼,一只羊和一筐菜,欲从河的左岸坐船到右岸,由于船太小,农夫每次只能带一样东西过河,并且没有农夫看管的话,狼会吃掉羊,羊会吃菜。

设计一个方案,使农夫可以无损失的过河2. 题目分析:假设人、狼、菜、羊都在河岸a,要到b 河岸去。

题中的食物链关系为: 菜→羊→狼 所以,第一次人只能带羊到b 河岸; 回到a 时,人不能再将刚带过来的羊带回去,所以人是空手回到a 的; 在a 河岸,人有两个选择选择一:(1) 带狼到b,人再回到a 时,因为不能把狼和羊同时留下,所以只能带走羊;AA 羊 A B羊狼 菜 怎么办呢 B 羊 B 狼 菜 菜 狼(2) 再次回到a 后,人再到b 时,不能把羊和菜同时留下,所以只能带走菜; (3) 再次回到a 时,因为狼和菜可以同时留下,所以优先选择空手过河;到a 后发现只剩下羊,所以带羊过河。

选择二:(1) 带菜到b,人再回到a 时,因为不能把菜和羊同时留下,所以只能带走羊;(2) 再次回到a 后,人再到b 时,不能把羊和狼同时留下,所以只能带走狼;狼 羊 羊 A菜 B 羊 狼 A B 狼 AB 狼 AB 羊菜 菜 菜(3) 再次回到a 时,因为狼和菜可以同时留下,所以优先选择空手过河;到a 后发现只剩下羊,所以带羊过河。

解:用四元组S 表示状态,即S =(L ,J ,M ,N )其中L :农夫 J :狼 M :羊 N :菜用0表示在左岸岸,1表示在右岸,即S=(0,0,0,0) 目标G =(1,1,1,1)定义操作符L (i )表示农夫带东西到右岸:i=0 农夫自己到右岸;i=1 农夫带狼到右岸;i=2 农夫带羊到右岸;i=3 农夫带菜到右岸;定义操作符R (i )表示农夫带东西到左岸:i=0 农夫自己到左岸;i=1 农夫带狼到左岸;i=2 农夫带羊到左岸;i=3 农夫带菜到左岸;约束状态如下:(1,0,0,1)狼、羊在左岸;(1,1,0,0)羊、菜在左岸;(0,1,1,0)狼、羊在右岸;(0,0,1,1)羊、菜在右岸;(1,0,0,0)狼、羊、菜在左岸;(0,1,1,1)狼、羊、菜在右岸;羊 A B狼 菜。

农夫过河问题

农夫过河问题

农夫过河问题农夫过河问题是一个古老的故事,不同版本中也有很多不同的答案。

农夫原本就在这条河边住着,但他决定搬到别处去居住。

于是他开始行动了。

然而,这次的搬家却让他碰上了一个难以解决的困境:当他走在桥上时,发现有一只老虎正站在对岸怒目圆睁地看着自己;他想从另外一座桥上通过,又担心对面的那只老虎会突然扑向他….经过几番思考后,农夫终于做出了选择,既然两边都有危险,那么为什么不退回到自己的房子里呢?于是,他带着满意的笑容进入了屋内。

结果没过多久,他就遇见了一位好朋友,并且将事情告诉了他。

农夫原本就在这条河边住着,但他决定搬到别处去居住。

于是他开始行动了。

然而,这次的搬家却让他碰上了一个难以解决的困境:当他走在桥上时,发现有一只老虎正站在对岸怒目圆睁地看着自己;他想从另外一座桥上通过,又担心对面的那只老虎会突然扑向他….经过几番思考后,农夫终于做出了选择,既然两边都有危险,那么为什么不退回到自己的房子里呢?于是,他带着满意的笑容进入了屋内。

结果没过多久,他就遇见了一位好朋友,并且将事情告诉了他。

这个人就建议他把这件事写下来,看看大家怎样认为。

他将自己所遭遇的两种截然相反的观点记录了下来。

最后,大家一致同意:“虽然你带着伤痛、疲倦和失望离开了人世,但我们还是非常敬佩你!因为你作出了明智的抉择——宁可挨饿受冻也要远离那只饥饿的老虎,尽管它已经威胁到了你的生命!”听完大家的评价后,农夫悲喜交加,喜的是自己摆脱了危机,悲的是没有得到众人的赞扬。

此时,他想起了那位好朋友曾说的话:“如果你像上帝一样思考,你便能够战胜任何挑战!”于是,他恍然大悟,紧握拳头道:“感谢上帝,赐予我坚强的性格吧!今天,我勇敢地迈出了跨越小溪的第一步!。

农夫过河问题的算法与实现汇总

农夫过河问题的算法与实现汇总

农夫过河问题的算法与实现院(系)名称专业班级学号学生姓名指导教师年月日目录引言 (1)一.问题的描述 (2)二.需求分析 (3)三.概要设计 (4)3.1数据结构的设计 (4)3.2算法的设计 (5)3.3抽象数据类型的设计 (5)四.详细设计 (6)4.1算法的主要思想 (6)4.2主要功能函数设计 (7)4.3算法的实现 (7)五.代码实现 (10)六.测试与运行 (18)6.1测试工具 (18)6.2运行结果 (18)七.总结与体会 (19)八.参考文献 (20)农夫过河问题的算法与实现引言所谓农夫过河问题是指农夫带一只狼、一只羊和一棵白菜在河南岸, 需要安全运到北岸。

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

问农夫怎么能安全过河, 当然狼吃羊, 羊吃白菜, 农夫不能将这两种或三种物品单独放在河的一侧, 因为没有农夫的照看, 狼就要吃羊, 而羊可能要吃白菜? 这类问题的实质是系统的状态问题, 要寻求的是从初始状态经一系列的安全状态到达系统的终止状态的一条路径.一.问题的描述任何的实际问题,都可以抽象成固定的数学模型,然后再根据模型解决问题。

这样就可以不考虑繁琐的实际过程,从而简化问题。

在我们的问题中,过河与没过河是两种不同的状态。

农夫、狼、羊和菜,分别处于这两种状态。

而,如果把他们看成一个系统,则农夫、狼、羊和菜的不同状态组合成系统的2的4次方种,即16种状态。

但在系统的16种状态中,有些不满足题给条件,应给予剔除。

剔除的判断条件:羊跟狼、菜状态相同,且不同于农夫的状态。

当我们挑选好一系列系统的合法状态后,我们的问题就清晰了很多。

我们不妨设,没过河状态为0,过河为1。

我们的问题就抽象为,系统从初始状态(0000),经过有限的合法状态,到达最终状态(1111)的过程。

系统不同的合法状态之间,可能,有的有路,有的则不能到达。

具体的判断条件是,农夫可以与一件物品同时边,或自己单独变。

根据这一个条件,我们可以抽象出一个图来:系统的每一种状态视为一个节点,满足条件的节点间有一条路。

农夫过河问题

农夫过河问题

课程设计题目:农夫过河一.问题描述一个农夫带着一只狼、一只羊和一箩白菜,身处河的南岸。

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

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

过河有以下规则:(1) 农夫一次最多能带一样东西(或者是狼、或者是羊、或者是白菜)过河;(2) 当农夫不在场是狼会吃羊;(3) 当农夫不在场是羊会吃掉白菜。

现在要求为农夫想一个方案,能将3 样东西顺利地带过河。

从出事状态开始,农夫将羊带过河,然后农夫将羊待会来也是符合规则的,然后农夫将羊带过河仍然是符合规则的,但是如此这般往返,搜索过程便进入了死循环,因此,在这里,采用改进的搜索算法进行搜索。

二.基本要求(1) 为农夫过河问题抽象数据类型,体会数据模型在问题求解中的重要性;(2) 要求利用数据结构的方法以及C + +的编程思想来完成问题的综合设计;(3) 在问题的设计中,使用深度优先遍历搜索方式,避免死循环状态;(4) 设计一个算法求解农夫过河问题,并输出过河方案;(5) 分析算法的时间复杂度。

三.概要设计(1) 数据结构的设计typedef struct // 图的顶点{int farmer; // 农夫int wolf; // 狼int sheep; // 羊int veget; // 白菜}Vertex;设计Vertex 结构体的目的是为了存储农夫、狼、羊、白菜的信息,因为在遍历图的时候,他们的位置信息会发生变化,例如1111 说明他们都在河的北岸,而0000 说明他们都在河的南岸。

t ypedef struct{int vertexNum; // 图的当前顶点数Vertex vertex[VertexNum]; // 顶点向量(代表顶点)bool Edge[VertexNum][VertexNum]; // 邻接矩阵 . 用于存储图中的边,其矩阵元素个数取决于顶点个数,与边数无关}AdjGraph; // 定义图的邻接矩阵存储结构存储图的方法是用邻接矩阵,所以设计一个简单的AdjGraph 结构体是为了储图的顶点数与边数,农夫过河问题我采用的是图的深度优先遍历思想。

农夫过河问题状态图及程序

农夫过河问题状态图及程序

农夫过河问题状态图及程序一、问题需求分析一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸。

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

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

另外,因为狼能吃羊,而羊爱吃白菜,所以农夫不能留下羊和白菜或者狼和羊单独在河的一边,自己离开。

请问农夫该采取什么方案才能将所有的东西运过河呢?二、算法选择求解这个问题的最简单的方法是一步一步进行试探,每一步都搜索所有可能的选择,对前一步合适的选择再考虑下一步的各种方案。

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

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

u 要实现广度优先搜索,一般都采用队列作为辅助结构。

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

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

三、算法的精化要模拟农夫过河问题,首先需要选择一个对问题中每个角色的位置进行描述的方法。

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

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

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

四、算法的实现完成了上面的准备工作,现在的问题变成:从初始状态二进制0000(全部在河的南岸) 出发,寻找一种全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸) 为最终目标,并且在序列中的每一个状态都可以从前一状态通过农夫(可以带一样东西)划船过河的动作到达。

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

讲故事2分钟又短又容易背初中

讲故事2分钟又短又容易背初中

2分钟故事篇一:《农夫过河》从前,一个农夫带了一只狗,一只兔子和一棵青菜,来到河边,他要把这三件东西带过河去。

那儿仅有一只很小的旧船,农夫每次最多只能带其中的一样东西上船,否则就有沉船的危险。

可是调皮的狗欺侮胆小的兔子,贪嘴的兔子又要吃鲜嫩的青菜。

先带什么呢?农夫想啊想,终于想出了一个过河的办法。

你们知道农夫是怎么做的吗?原来农夫第一次先带兔子到对岸,然后空手回来。

第二次,带狗到对岸,但把兔子带回来。

第三次,把兔子留下,带菜到对岸,空手回来。

最后,带兔子到对岸。

这样三件东西都带过河去了,一件也没有遭受损失。

篇二:《生命的价值》在一次讨论会上,一位著名的演说家没讲一句开场白,手里却高举着一张20美元的钞票。

面对会议室里的200个人,他问:“谁要这20美元?”一只只手举了起来。

他接着说:“我打算把这20美元送给你们中的一位,但在这之前,请准许我做一件事。

”他说着将钞票揉成一团,然后问:“谁还要?”仍有人举起手来。

他又说:“那么,假如我这样做又会怎么样呢?”他把钞票扔到地上,又踏上一只脚,并且用脚碾它。

尔后他拾起钞票,钞票已变得又脏又皱。

“现在谁还要?”还是有人举起手来。

“朋友们,你们已经上了一堂很有意义的课。

无论我如何对待那张钞票,你们还是想要它,因为它并没贬值,它依旧值20美元。

人生路上,我们会无数次被自己的决定或碰到的逆境击倒、欺凌甚至碾得粉身碎骨。

我们觉得自己似乎一文不值。

但无论发生什么,或将要发生什么,在上帝的眼中,你们永远不会丧失价值。

在他看来,肮脏或洁净,衣着齐整或不齐整,你们依然是无价之宝。

”篇三:《不吃鸡蛋》有个南方人,从来不吃鸡蛋。

一次,他出远门到北方。

在路上走得累了,肚子也咕咕直叫,就进了一家小店坐下,吃些东西。

店里的伙计一看有客来了,忙过来招呼,殷勤地边擦桌子边问:“客官,您想吃些什么?”这个南方人第一次来北方,对北方的菜很不熟悉,就随便地说道:“有什么好菜就上吧。

”伙计应道:“本店的木楫肉做得可拿手了,您可以尝一尝。

农夫过河

农夫过河

1 8+ 3 = 6
个 所 把 多 来 个 玻 璃 分 给 (
)。
以 田田要 ,

的 9 - 6 = 3 (


丁 丁 6

个 分 给 牛 牛 个 4 = 2 (
),
6 - 5= 1(
)。
这 样 , 他 们 三 人 的 玻 璃 球 就 变 得
样 多 了 一 。
( 作 者 单 位 : 江 苏 省 海 门 市 天 补 小 学 )
我 是 这样解 的
在 总 数 不 变 的 情 况 下 , 要 让 三 人 的 玻 璃 球 数 量 变
得 相 等 可 以 将 三 人 的 玻 璃 球 总 数 量 平 均 分 。 三 人 一 ,
共 有 玻 璃 球 个 平 均 分 给 人 每 人 应 得 + + 9 4 8

= 1

),
3 ,
MH -


r-
分 玻 璃 球 进 行 平 均 分 , 平 均 分 给 三 人 , 每 人 得 到 玻 璃 球 6+3 = 2
多 应 给 牛 个 (
)。
所以 田田 ,
出的 5个
分 丁 丁2 个 分 给 牛 ,
2 -



( 个 ) , 这 样 他 们 三 人 的 玻 璃 球 就 变 得 一 样 多 了 。
參辦通, 狗 会 咬 猫 。
?通數 笺
猫 会 吃 鱼 但 是 狗 不 吃 鱼 。 ,
小朋友
要 把 猫 狗 、


鱼 都 带 过 河 , 你 认 为 农 夫 应
该 怎 样 安 排 这 次 过 河 呢 ?
《 参考罄鮝見鑲 M I 》

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
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; //没有找到此顶点
}
// 判断目前的(F,W,S,Fra bibliotek)是否安全 bool isSafe(int farmer, int wolf, int sheep, int veget)
{
while (i != end)
{
cout << "(" << judgement(graph->vertex[i].farmer) << ", " << judgement(graph->vertex[i].wolf)
<< ", " << judgement(graph->vertex[i].sheep) << ", " << judgement(graph->vertex[i].veget) << ")";
{
for (int wolf = 0; wolf <= 1; wolf++)
{
for (int sheep = 0; sheep <= 1; sheep++)
{
for (int veget = 0; veget <= 1; veget++)
{
if (isSafe(farmer, wolf, sheep, veget))
#include<stdio.h>
#include<stdlib.h>
#define MAXNUM 20
typedef int DataType;
struct SeqQueue {
int f, r;
DataType q[MAXNUM];
cout << endl;
}
// 深度优先搜索从u到v的简单路径 //DFS--Depth First Search
void dfsPath(AdjGraph *graph, int start, int end)
{
int i = 0;
visited[start] = true; //标记已访问过的顶点
{
if ( graph->vertex[i].farmer == farmer && graph->vertex[i].wolf == wolf
&& graph->vertex[i].sheep == sheep && graph->vertex[i].veget == veget )
cout << endl;
i = retPath[i];
}
cout << "(" << judgement(graph->vertex[i].farmer) << ", " << judgement(graph->vertex[i].wolf)
<< ", " << judgement(graph->vertex[i].sheep) << ", " << judgement(graph->vertex[i].veget) << ")";
}
// 输出从u到v的简单路径,即顶点序列中不重复出现的路径
void printPath(AdjGraph *graph, int start, int end)
{
int i = start;
cout << "farmer" << ", wolf" << ", sheep" << ", veget" << endl;
if (start == end)
{
return ;
}
for (i = 0; i < graph->vertexNum; i++)
{
if (graph->Edge[start][i] && !visited[i])
{
retPath[start] = i;
{
k++;
}
if (graph->vertex[i].sheep != graph->vertex[j].sheep)
{
k++;
}
if (graph->vertex[i].veget != graph->vertex[j].veget)
{
k++;
}
dfsPath(&graph, start, end);
if (visited[end]) // 有结果
{
printPath(&graph, start, end);
return 0;
}
return -1;
}
输出结果:
广度优先(队列)源代码:
paqu->r = (paqu->r + 1) % MAXNUM;
}
}
void deQueue_seq( PSeqQueue paqu ) {
if( paqu->f == paqu->r )
深度优先搜索方法:首先扩展最新产生的结点,每层只对一个结点进行扩展,除非搜索失败或以达到预先约定的最大深度,才会退回去搜索原来来忽略的结点。
广度优先搜索方法:以接近起始结点的程度依次扩展结点,即对下一层结点搜索前,必须先搜索完本层所有结点。
深度优先(栈)源代码:
#include<iostream>
printf("Out of space!! \n");
else
paqu->f = paqu->r = 0;
return (paqu);
}
int isEmptyQueue_seq( PSeqQueue paqu ) {
return paqu->f == paqu->r;
// 以上三个条件不同时满足两个且农夫状态改变时,返回真, 也即农夫每次只能带一件东西过桥
if (graph->vertex[i].farmer != graph->vertex[j].farmer && k <= 1)
{
return true;
}
else
//当农夫与羊不在一起时,狼与羊或羊与白菜在一起是不安全的
if ( farmer != sheep && (wolf == sheep || sheep == veget) )
{
return false;
}
else
{
return true; // 安全返回true
}
dfsPath(graph, i, end);
}
}
}
int main()
{
AdjGraph graph;
CreateG(&graph);
int start = locate(&graph, 0, 0, 0, 0);
int end = locate(&graph, 1, 1, 1, 1);
问题描述:
一农夫带着一头狼,一只羊和一个白菜过河,小船只能一次装载农夫和一样货物,狼会吃羊,羊会吃白菜,只有农夫在时才安全。现欲让所有物品包括农夫都安全过道河对岸,求最佳算法。
相关文档
最新文档