农夫过河

合集下载

农夫过河演示文稿

农夫过河演示文稿

图论问题
• 将各个顶点与人狼羊菜这一点的距离标示 在图顶处,于是可以看到有两种最迅速而 且安全的运送方案 • (1)人狼羊菜,狼菜,人狼菜,狼,人狼 羊,羊,人羊,空; • (2)人狼羊菜,狼菜,人狼菜,菜,人羊 菜,羊,人羊,空。 • 每种方案都要渡河七次。
搜索问题
FWDC
F W
DC
F WG C
• 去掉不可能的状态:狼羊菜,羊菜,狼羊 • 与之对应的三种状态也不可能出现,所以剩下10 种可能的情形。
• 将这十种情形看作是点,只有在两种状态可以相 互转变的时候,在他们之间建立一条边线。 • 至此,整个题目就变成了{人狼羊菜}=>。。。=》 {}的过程;也就是从图中找出从“人狼羊菜”到 “空”的最短路径。
WG C F F W
G C F
W G
C F
WG C
F W G
C
F WG C
W F G
C F WG
C F
W G C
F WG
C
F W G
C
F W
G C
F W G C
F WG C
F W G
C
G C F W F WG
C F W
G C F
WG C F W
G C F
W G C
F W
G C
F WG C
F W
G C
G F W C F WG C
Illegal State
Repeated State
Goal State
F WD C
F
W D C
最初状态 人带羊到对岸 人独自返回 人带狼到对岸
W F D
C F
W D
C
F W D

农夫过河问题状态空间表示

农夫过河问题状态空间表示

逻辑学教授的3个得意门生ABC,前一晚在酒吧喝多了,结果第二天3人集体迟到。

教授说:“作为对你们迟到的惩罚,你们3人必须比其他同学多做一道作业,完成了这道作业才可以离开教室。

”这道附加的作业是一道帽子题,教授给每人戴了顶帽子,帽子不是红色就是白色,不是白色就是红色。

每人都能看见其他2人帽子的颜色,却不能看见自己帽子的颜色。

每人都看到其他2人帽子的颜色后,每思考5分钟为一轮,谁猜出自己帽子的颜色了就可以说出来并离开。

教授还说:“你们3人中至少有1人戴了红色帽子。

”第一轮下来,A说:“我没猜出来。

”B说“我也没猜出来”C说:“我也猜不出。

”第二轮下来,还是没人能猜出自己帽子的颜色。

第三轮,3人都猜出了自己帽子的颜色。

问:ABC三人头顶都是什么颜色的帽子?然后用谓词逻辑写出推理过程。

最一般合一及归结反演相关已知w={P(f(x,g(A,y)),z), P(f(x,z),z),求MGU令δ0=ε,w0=w,因w中含有两个表达式,因此δ0不是最一般合一差异集D0={g(A,y)/z}δ1=δ0ºD0={g(A,y)/z}w1={P(f(x,g(A,y)),g(A,y)), P(f(x,g(A,y)),g(A,y))w1中仅含有一个表达式,所以δ1就是最一般合一。

证明G是否是F1、F2的逻辑结论。

F1:(∀x)(P(x)→(Q(x)∧R(x)))F2:(∃x)(P(x)∧S(x))G: (∃x)(S(x)∧R(x))F1: ¬P(x)∨(Q(x)∧R(x)) ⇒(¬P(x)∨Q(x)) ∧(¬P(x)∨R(x))F2: P(x)∧S(x)¬G: ¬(∃x)(S(x)∧R(x)) ⇒ (∀x)(¬(S(x)∧R(x))) ⇒¬S(x)∨¬R(x)子句集:1 ¬P(x)∨Q(x)2 ¬P(x)∨R(x)3 P(x)4 S(x)5 ¬S(x)∨¬R(x)其中2与3规约,4与5归结,其结果再归结得到空子句,证明G是F1与F2的结论。

课程设计农夫过河

课程设计农夫过河

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

农夫过河问题

农夫过河问题

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

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

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

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

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

农夫携物过河程序

农夫携物过河程序

题目内容:有一农夫要将自己的羊、蔬菜和狼等3件物品运过河。

但农夫过河时所用的船每次最多只能装其中的一件物品,而这3件物品之间又存在一定的制约关系:羊不能单独和狼以及不能和蔬菜在一起,因为狼要吃羊,羊也能吃蔬菜。

试构造出问题模式以编程实现这一问题的求解。

1、问题分析和任务定义:根据对象的状态分为过河(1)和不过河(0),此对象集合就构成了一个状态空间。

问题就是在这个状态空间内搜索一条从开始状态到结束状态的安全路径。

显然,其初始状态为四对象都不过河,结束状态为四对象全部过河。

这里用无向图来处理,并采用邻接矩阵存储。

对于农夫,狼,羊,蔬菜组成一个4位向量,即图的顶点(F,W,S,V),状态空间为16,初始状态为(0000),目标为(1111)。

解决问题的方法是,找到所有的安全状态,并在其中搜索出一条(0000)到(1111)的路径。

对当前对象是否安全的判断,若当农夫与羊不在一起时,狼与羊或羊与蔬菜在一起是不安全的,其他情况是安全的。

搜索一条可行路径时,采用深度优先搜索DFS_path,每个时刻探索一条路径,并记录访问过的合法状态,一直向前探视,直到走不通时回溯。

显然,应该用数组来保存访问过的状态,以便回溯。

显然农夫每次状态都在改变,最多也就能带一件东西过河,故搜索条件是,在顶点(F,W,S,V)的转换中,狼,羊,蔬菜三者的状态不能大于一个,即只有一个发生改变或者都不变。

①数据的输入形式和输入值的范围:本程序不需要输入数据,故不存在输入形式和输入值的范围。

②结果的输出形式:在屏幕上显示安全状态的转换,即一条安全路径。

2、数据结构的选择概要设计⑴数据结构的选择:本程序采用无向图处理。

#define MaxNumVertices 10 //最大顶点数typedef struct //图的顶点类型{int Farmer,Wolf,Sheep,Veget;//存储农夫,狼,羊,蔬菜的状态}VexType;typedef struct//图的各项信息{int VertexNum,CurrentEdges; //图的当前顶点数和边数VexType VerticesList[MaxNumVertices]; //顶点向量(代表顶点)int Edge[MaxNumVertices][MaxNumVertices];//邻接矩阵//用于存储图中的边,其矩阵元素个数取决于顶点个数,与边数无关}AdjGraph;⑵为了实现上述程序的功能,需要:①生成所有安全的图的顶点;②查找顶点的位置;③判断目前(F,W,S,V)是否安全,安全返回1,否则返回0;④判断顶点i和顶点j之间是否可转换,可转换返回真,否则假;⑤深度优先搜索从u到v的简单路径;⑥输出从u到v的简单路径,即顶点序列中不重复出现的路径。

农夫过河问题

农夫过河问题

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

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

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

解:用四元组(农夫,狐狸,鹅,麦粒)表示状态,其中每个元素都可为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的状态。

农夫过河问题

农夫过河问题

农夫过河问题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) 当农夫不在场是羊会吃掉白菜。

现在要求为农夫想一个方案,能将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 结构体是为了储图的顶点数与边数,农夫过河问题我采用的是图的深度优先遍历思想。

农夫过河报告

农夫过河报告

喜啦啦了喜啦啦了喜啦啦了组员:李琦、郑鸿飞、王琅辉、张育博这最起码是一个报告,虽然我尽力的看,终究还是看不懂。

.摘要农夫过河问题是应用广度优先搜索和深度优先搜索的典型问题,但这里我们应用了简单的数组,通过层层筛选的手段也解决了同样的问题,其中用到了部分广度优先搜索的思想。

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

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

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

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

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

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

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

2.农夫过河算法源代码#include <>#define MAX 16typedef struct FWSV{int farmer;int wolf;int sheep;int vegetable;}Item;armer = f;safe[k].wolf = w;safe[k].sheep = s;safe[k].vegetable = v;k++;}}}}}}Item * judge(Item Fwsv){Item * next;Item compare[4];next = compare;int x1 = 0;int sum = 0;if == 0){for (int x = 0;x < k;x++){armer == && safe[x].wolf == && safe[x].sheep == && safe[x].vegetable == ){safe[x].farmer = 0;safe[x].wolf = 0;safe[x].sheep = 0;safe[x].vegetable = 0;}armer == 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++){olf !=|| != && compare[x2].sheep !=|| != && compare[x2].vegetable !=|| != && compare[x2].vegetable != ){compare[x2].farmer = 0;compare[x2].wolf = 0;compare[x2].sheep = 0;compare[x2].vegetable = 0;}sum+=2;armer + 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",compare[x3].farmer,compare[x3].wolf,compare[x3].sheep,compare[x3].veget abl );}}}if == 1){for (int y = 0;y < k;y++){if(safe[y].farmer == && safe[y].wolf == && safe[y].sheep == && safe[y].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 = + + + ;if ( != && compare[x2].wolf !=|| != && compare[x2].sheep !=|| != && compare[x2].vegetable !=|| != && compare[x2].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,compare[x3].sheep,compare[x3].vegetable );}}}return next;}3.算法功能说明和流程描述首先我们定义了一个结构体Itemtypedef struct FWSV{int farmer;int wolf;int sheep;int vegetable;}Item;Item中包含了农夫(farmer),狼(wolf),羊(sheep),白菜(vegetable),用来表示农夫、狼、羊、白菜的状态,并作出规定当为0的时候表示在左岸,当为1的时候表示在右岸,我们的目标便是从0000的状态到1111的状态。

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

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

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

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

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

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

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

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

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

最后,带兔子到对岸。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

一次,他出远门到北方。

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

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

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

题目 流程农夫过河

题目 流程农夫过河

题目流程农夫过河一、基础过河规则类题目(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)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.瓶子的价格姐妹俩在逛街。

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

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

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

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

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

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

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

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

”小游说:“我没有吃。

”画画说:“红红说谎。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

农夫过河问题——程序设计
(2009-06-05 13:38:22)
标签:分类:
一、问题需求分析
一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

为了实现广度优先搜索,算法中需要使用了一个整数队列moveTo,它的每个元素表示一个可以安全到达的中间状态。

另外还需要一个数据结构记录已被访问过的各个状态,以及已被发现的能够到达当前这个状态的路径。

由于在这个问题的解决过程中需要列举的所有状态(二进制0000 ~ 1111)一共16种,所以可以构造一个包含16个元素的整数顺序表来满足以上的要求。

用顺序表的第i个元素记录状态i是否已被访问过,若已被访问过则在这个顺序表元素中记入前驱状态值,算法中把这个顺序表叫做route。

route的每个分量初始化值均为-1,每当我们在队列中加入一个新状态时,就把顺序表中以该状态作下标的元素的值改为达到这个状态的路径上前一状态的下标值。

route的一个元素具有非负值表示这个状态已访问过,或是正被考虑。

最后我们可以利用route顺序表元素的值建立起正确的状态路径。

五、程序代码
n");
else
{
queue->q[queue->r] = x;
queue->r = (queue->r + 1) % queue->MAXNUM;
}
}
void deQueue_seq(PSeqQueue queue)
n");
else
queue->f = (queue->f + 1) % queue->MAXNUM;
}
DataType frontQueue_seq(PSeqQueue queue)
{
if (queue->f == queue->r)
printf("Empty Queue.\n");
else
return (queue->q[queue->f]);
}
n");
//问题无解
}
六、测试结果
程序输出按相反的变化方向输出的,真实的情况应该是从0、9、……、15变化的。

七、总结和体会
这个程序还有很大的改进空间,首先是人性化方面的设计,这个程序最终的输出结果是用10进制的,而我们需要知道的应该是二进制的结果,所以应该直接把结果输出为二进制,还要按开始到最终状态的排序输出。

还有一种更为人性化的设计,就是把对应的每个二进制代码代表的含义直接用中文表示出来,这样的结果更直观,方便用户使用。

例如:0000时,程序输出:所有的物品都在南岸。

后面的一个状态是9(1001),程序输出:农夫和羊到了北岸。

通过这个程序的学习,很受启发,明白了如何用计算机解决实际生活中的问题。

刚开始接到这个题目时,感觉到相当困难,因为这种题以前是考验我们的IQ用的,现在没想到要用计算机来解决,而且计算机又没有思想,怎样让它想问题,实现我们需要的功能。

原来,可以把实际的问题转变为数学模型,通过计算机超强悍的循环功能和强大的数据处理能力,把所有可能的结果都算出来,然后用约束项来对这些结果进行筛选,然后把结果用数学格式来输出,让问题得以求解。

这个程序的设计方法比较巧妙的地方是数学建模,即每个角色的位置进行描述的方法:用四位二进制数顺序分别表示农夫、狼、白菜和羊的位置。

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

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

这个方法令人拍案叫绝,不得不佩服人类的智慧。

相关文档
最新文档