一个农夫带着一只狼、一只山羊和一篮蔬菜要过河,但只有一条小船PPT名师课件
- 格式:ppt
- 大小:1.67 MB
- 文档页数:41
狼羊草过河问题描述•一位农夫带了狼、羊、草,准备过河。
可是小船每次只能容下农夫和一件物品。
渔民不在时,狼会吃羊、羊会吃草。
而且,我们假设,狼或羊在农夫不在时不会自己跑掉或被人牵走且农夫会划船。
要求我们设计一个方案,使人、狼、羊、草都能安全过河。
问题分析及假设过河问题相当于状态的转移。
初状态是人,狼,羊,草均在此岸,目标终状态是人,狼,羊,草均在对岸。
定义以下两种向量表示状态的转移:•状态向量:用四维向量(人,狼,羊,草)表示人,狼,羊,草各自的状态,记“在此岸”时各分量为“1”,否则为“0”。
例如:(1,1,1,1)表示人,狼,羊,草均在此岸,(0,0,0,0)表示人,狼,羊,草均在对岸。
•运载向量:用四维向量(人,狼,羊,草)表示他们各自被运载的情况,记“被运载”时各分量为“1”,否则记为“0”。
例如:(1,1,0,0)表示被运载的是人和狼,又如(1,0,1,0)表示被运载的是人和羊。
模型定义根据题设要求,在满足系统限定条件下,可得以下状态向量和运载向量集合:•用S表示所有允许状态向量的集合,则S={(1,1,1,1),(1,1,1,0),(1,1,0,1),(1,0,1,1),(1,0,1,0),(0,1,0,1),(0,0,0,1),(0,0,1,0),(0,1,0,0),(0,0,0,0)}•用D表示所有允许运载向量的集合,则D={(1,0,0,0),(1,1,0,0),(1,0,1,0),(1,0,0,1)}状态转移方程:原状态⊕运载=现状态运算规则:1+1=0,1+0=1,0+1=1,0+0=0可取状态向量允许运载方式:可取状态向量+ 可取运载向量=模型求解(1,1,0,0)(1,0,1,0)(1,0,0,1)(1,0,0,0)1.(1,1,1,1) += (0,0,1,1)×= (0,1,0,1)√= (0,1,1,0)×= (0,1,1,1)×(1,1,0,0)(1,0,1,0)(1,0,0,1)(1,0,0,0)2.(0,1,0,1) += (1,0,0,1)×= (1,1,1,1) ×= (1,1,0,0)×= (1,1,0,1)√解法一:初始状态(1,1,1,1)经多次运载状态变化成最终状态(0,0,0,0)(1,1,0,0)(1,0,1,0)(1,0,0,1)(1,0,0,0)3.(1,1,0,1) += (0,0,0,1)√= (0,1,1,1) ×= (0,1,0,0)√= (0,1,0,1)√(1,1,0,0)(1,0,1,0)(1,0,0,1)(1,0,0,0)4.1. (0,0,0,1) += (1,1,0,1)√= (1,0,1,1) √= (1,0,0,0)×= (1,0,0,1)×(1,1,0,0)(1,0,1,0)(1,0,0,1)(1,0,0,0)4.2.(0,1,0,0) += (1,0,0,0)×= (1,1,1,0) √= (1,1,0,1)√= (1,1,0,0)×4.3. (0,1,0,1)与上述第二步重复,必定不是最优解,故不用进行下去。
数据结构课程设计《农夫过河》学院:软件学院班级:12软工移动2班姓名:学号:12151156711 问题描述农夫过河问题是指农夫带一只狼、一只羊和一棵白菜在河南岸, 需要安全运到北岸。
一条小船只能容下他和一件物品, 只有农夫能撑船,问农夫怎么能安全过河?狼吃羊, 羊吃白菜, 农夫不能将这两种或三种物品同时放在河的一侧, 因为没有农夫的照看, 狼就要吃羊, 而羊可能要吃白菜。
这类问题的实质是系统的状态问题, 要寻求的是从初始状态经一系列的安全状态到达系统的终止状态的一条路径。
2概要设计2.1 数据结构的设计农夫过河问题的模型化有一组状态( 如农夫和羊在南, 狼和白菜在北) ; 从一个状态可合法地转到另外几个状态( 如农夫自己过河或农夫带着羊过河) ; 有些状态不安全( 如农夫在北, 其他东西在南) ; 有一个初始状态( 都在南) ; 结束状态( 这里只有一个, 都在北) 。
问题表示: 需要表示问题中的状态, 农夫等位于南和北( 每个有两种可能) 。
可以采用位向量, 4 个二进制位的情况表示状态, 显而易见, 共24= 16种可能状态。
从高位到低位分别表示农夫、狼、白菜和羊。
0000( 整数0) 表示都在南岸, 目标状态1111( 即整数15) 表示都到了北岸。
有些状态0011,0101, 0111, 0001, 1100, 1001 是不允许出现的, 因为这些状态是不安全状态。
f( farmer) , w(wolf) , g(goat) , c( cabbage) 分别表示农夫自己、农夫携带狼、农夫携带羊、农夫携带菜过河。
现在的问题转化为: 找一条合法路径( 相邻状态之间的转移合法) , 从开始状态到某个结束状态, 途中不经过不安全状态。
2.2算法的设计求农夫、狼、白菜和羊的当前状态的函数为每一种状态做测试, 状态安全则返回0, 否则返回1。
安全性判断函数, 若状态安全则返回0int farmer(int location) //判断农夫位置对0做与运算,还是原来的数字,用来判断位置{return 0 != (location & 0x08);}int wolf(int location) //判断狼位置{return 0 != (location & 0x04);}int cabbage(int location) //判断白菜位置{return 0 != (location & 0x02);}int goat(int location) //判断羊的位置{return 0 !=(location & 0x01);}int safe(int location) // 若状态安全则返回 true{if ((goat(location) == cabbage(location)) && (goat(location) != farmer(location)) )return 0;if ((goat(location) == wolf(location)) && (goat(location) != farmer(location)))return 0;return 1; //其他状态是安全的借助于位向量和按位运算符, 很容易描述过河动作, 这种问题表示的设计使得程序的实现比较容易。
程序设计报告题目:农夫过河专业:计算机科学与技术小组成员:班级:指导教师:日期:2014年12月25日成员分工:农夫过河【摘要】农夫问题即一个农民带着一只狼、一只羊和一棵白菜,身处河的南岸,他需要把这些东西全部运到河的北岸。
而他只有一条小船,且这只小船小到只能容下他和一件物品,另外只有农民能撑船。
农夫不能留下狼和羊自己离开,也不能留下白菜和羊自己离开,更不能留下狼,羊和白菜而独自离开,因为没有农夫的照看,狼就要吃掉羊,而羊又要吃掉白菜。
好在狼是是肉动物,它不吃白菜,问农夫应该采取什么方案才能将所有的东西安全地从河的南岸运到北岸?这类农夫问题是一个传统的数据结构问题,利用基于队列的图的广度优先搜索求解农夫过河问题是一个易于理解、切实可行的方案,具有一定的推广价值。
关键字:农夫过河问题;队列;广度优先搜索一、实验内容概述(设计任务与技术要求)农民过河问题是指农民需要带一只狼、一只羊和一棵白菜到河的南岸去,需要安全运到北岸。
而一条小船只能容下他和一件物品,只有农民能撑船。
问农民怎么能安全过河,问题中需要涉及到狼会吃羊,羊会吃白菜,所以农民不能将这两种或三种物品单独放在河的一侧,因为没有农民的照看,狼就要吃掉羊,而羊可能又要吃掉白菜。
这类问题的实质是系统的状态问题,要寻求的是从初始状态经一系列的安全状态到达系统的终止状态的一条路径。
根据实际情况,对此问题分析可以得到不同的特征:1,是农民和羊在河的南岸,狼和白菜在河的北岸;2,是从一个状态可转到另外一个状态,而不违反狼吃羊,羊吃草的规则(例如农民自己过河或者农民带着羊过河);3,是有些状态是不安全的(例如农民一人在北岸,而其他的东西都在南岸);4,是初始状态是农民,羊,狼,白菜都在河的南岸和结束状态是农民,羊,狼,白菜都在河的北岸。
实现农夫过河问题,则需要找到一条合法的路径(相邻状态之间的转移合法),从开始状态到某个结束状态,路途中不能经过不安全的状态。