人狼羊过河问题
趣味数学题带答案

趣味数学题带答案数学,这个神奇的领域,充满了无数有趣又能锻炼思维的谜题。
今天,就让我们一起来探索几道趣味数学题,感受数学的魅力。
题目一:分苹果篮子里有 9 个苹果,要把这些苹果分给 10 个小朋友,每个小朋友分 1 个,篮子里还得留 1 个,怎么分?答案:把最后 1 个苹果连篮子一起给一个小朋友。
这道题看似简单,却需要我们打破常规的思维方式。
一开始,我们可能会直接想着怎么平均分 9 个苹果给 10 个人,但换个角度,让篮子和苹果一起成为一份,问题就迎刃而解了。
题目二:过河有一个人带着一只狼、一只羊和一筐白菜要过河。
河边只有一条船,一次只能带一样东西过河。
如果人不在,狼会吃羊,羊会吃白菜。
怎样才能安全过河?答案:第一步,人把羊带过河,然后独自返回;第二步,人把狼带过河,把羊带回来;第三步,人把白菜带过河,独自返回;第四步,人把羊带过河。
这道题需要我们仔细考虑各种情况,合理安排过河的顺序,确保每一步都不会出现损失。
通过逐步分析和推理,就能找到最佳的解决方案。
题目三:买汽水1 元钱一瓶汽水,喝完后两个空瓶换一瓶汽水。
如果你有 20 元钱,最多可以喝到多少瓶汽水?答案:20 元可以买 20 瓶汽水。
喝完 20 瓶后,用 20 个空瓶换 10 瓶汽水;喝完 10 瓶后,用 10 个空瓶换 5 瓶汽水;喝完 5 瓶后,用 4 个空瓶换 2 瓶汽水,此时还剩下 1 个空瓶;喝完 2 瓶后,用 2 个空瓶换 1 瓶汽水;喝完 1 瓶后,加上之前剩下的 1 个空瓶,再换 1 瓶汽水。
所以一共可以喝到 20 + 10 + 5 + 2 + 1 + 1 = 39 瓶汽水。
这道题需要我们注意空瓶的循环利用,通过不断的兑换,计算出最终能喝到的汽水数量。
题目四:找规律观察以下数字序列:1,4,7,10,13,(),19。
括号里应该填什么数字?答案:16。
因为这些数字依次增加 3,13 + 3 = 16。
找规律的题目需要我们敏锐地观察数字之间的关系,发现其中的规律,从而得出答案。
一个农民携带一只狼,一只羊和一个白菜的作文

一个农民携带一只狼,一只羊和一个白菜的作文作文一小朋友们,今天我要给你们讲一个有趣的故事。
有个农民呀,他要带着一只狼、一只羊还有一个白菜过河。
这可难坏他啦!要是先把狼带过去,那羊会把白菜吃掉。
要是先带羊过去,狼又会把羊吃掉。
这可怎么办呢?后来呀,农民想了个好办法。
他先把羊带过河,然后自己回来。
再把白菜带过去,把羊带回来。
接着把狼带过去,自己再回来。
最后把羊带过去。
这样,农民就顺利地把它们都带过去了。
你们说,这个农民聪明不聪明呀?作文二小朋友们,听我来讲个故事。
有个农民,带着一只狼、一只羊和一个白菜。
这狼可凶啦,总想吃羊。
羊呢,又喜欢吃白菜。
农民犯愁啦,怎么才能都带过河去呢?他想来想去,有主意啦!农民先把羊带到河对岸,自己再回来。
然后把白菜带过去,放下白菜,再把羊带回来。
接着把狼带过去,自己一个人回来。
最后把羊带过去。
这下,农民可高兴啦,他成功地把它们都带过去了。
小朋友们,要是你们,能想到办法吗?作文三小朋友们,今天我要讲一个好玩的故事。
有一个农民,他手里有一只狼、一只羊和一个白菜。
他们要一起过河,但是农民很担心。
因为如果他不在,狼会吃羊,羊会吃白菜。
那怎么办呢?农民想啊想,终于想到办法了。
他先带着羊过河,然后自己回来。
再带着白菜过河,把羊带回来。
接着带狼过河,自己回来。
最后带着羊过河。
小朋友们,你们觉得这个农民厉害不?作文四小朋友们,快过来听故事啦。
有个农民,带着一只坏坏的狼、一只乖乖的羊和一个大大的白菜。
他们走到河边,农民着急了。
要是把狼和羊一起留下,狼会吃羊。
要是把羊和白菜一起留下,羊会吃白菜。
聪明的农民想了个好办法。
他先带着羊过河,自己回来。
再带着白菜过河,把羊带回来。
然后带着狼过河,自己回来。
最后带着羊过河。
小朋友,你们喜欢这个故事吗?作文五小朋友们,我给你们讲个有趣的事儿。
有个农民,带着一只狼、一只羊和一个白菜,要过河。
农民可头疼了,因为狼会吃羊,羊会吃白菜。
不过,农民很聪明哦。
他先把羊运到对岸,自己回来。
农夫过河——狼羊菜问题

农夫过河——狼⽺菜问题
话说⼀位农夫带着⼀只狼、⼀只⽺和⼀个卷⼼菜过河,⽆奈船⼩,农夫每次只能运送⼀样东西,考虑到狼吃⽺、⽺吃菜,因此运送的顺序⾄关重要。
在现实世界⾥解决这个问题并不困难,相信很多⼈都已经有了答案,但是如何⽤程序来解决这⼀问题,就需要动动脑筋了。
这⼜是⼀个与移动物品有关的问题,在前⾯汉诺塔的例⼦中,我们已经领略了解决这类问题的⽅法,⼤致分为三个步骤:
1. 将现实问题转化为数学问题,即,建⽴模型;
2. 将数学问题转化为程序问题,即,给出数据结构及算法;
3. 编写程序解决问题。
下⾯我们就沿着这样的思路来寻找问题的答案。
阅读原⽂。
高一渡河问题知识点

高一渡河问题知识点渡河问题是数学中的一个经典问题,也是高中数学课程中常见的一个难点。
通过解决渡河问题,可以培养学生的逻辑思维和数学建模能力。
本文将对高一阶段渡河问题的相关知识点进行介绍。
一、渡河问题的基本概念在渡河问题中,我们通常会遇到一条河、若干个人物以及一艘船。
人物需要通过船从一岸渡到另一岸,但是船的承载能力有限,每次只能运送一定数量的人物。
同时,还需要满足一些限制条件,如某些人只能在船上或在岸上,人物之间存在某些关系等。
我们的目标是找到一种策略,使得所有人物都能够安全渡河。
二、渡河问题的解题思路解决渡河问题的关键是找到一种合适的策略,使得每次渡河都满足限制条件。
一般来说,我们可以采用穷举法、逆向思维等方法解决渡河问题。
1.穷举法穷举法是一种常用的解决渡河问题的方法。
我们可以列举出所有可能的渡河顺序,然后逐个验证是否满足限制条件。
在渡河问题中,往往需要考虑到各个人物之间的关系,比如有的人物只能与某些人一起渡河,有的人物只能留在某一侧等。
通过穷举法,我们可以一一尝试,找到符合要求的渡河方案。
2.逆向思维逆向思维是另一种解决渡河问题的思路。
我们可以从目标开始,逆向思考如何将人物安全地渡到目标岸。
通过分析限制条件,我们可以找到一系列可行的操作步骤,并逐步将人物从目标岸逆推回起始岸。
逆向思维可以帮助我们找到一种可行的策略,从而解决渡河问题。
三、渡河问题的典型案例下面我们将介绍两个典型的渡河问题案例,以帮助学生更好地理解解题方法。
1.渡河问题案例一问题描述:有父亲、母亲、儿子和女儿四人要过一座桥,桥很窄,一次只能通过两人,而且过桥的速度是两人中走得慢的那个人的速度。
已知父亲走得最快,母亲走得最慢,儿子的速度比女儿的速度略快。
要求找出一种过桥的策略,使得所有人都能安全过桥,并且所用的时间最短。
解题思路:首先,父亲与母亲必须一起过桥,因为父亲是最快的,母亲是最慢的。
其次,父亲再回到起始岸,带女儿过桥。
接下来,父亲再与儿子一起过桥,最后父亲再回到起始岸,带母亲过桥。
狼羊草过河的故事

狼羊草过河的故事全文共四篇示例,供读者参考第一篇示例:从前有一只狼、一只羊和一棵草,它们生活在一条湍急的河边。
一天,它们决定一起过河。
狼是最先决定过河的,因为它很饿了,想要去对岸寻找食物。
但狼知道自己不能把羊和草单独留在一起,因为狼会吃羊,而羊会吃草。
于是,狼想了一个办法:它先把羊带过河,再回来把草载过来。
狼带着羊过了河,把羊放在对岸后立即返回来。
它发现草还在对岸,于是载着草过河。
当狼把草载到对岸后,它发现羊不见了,只留下了一个空空的对岸。
原来,狼载着草过河后,又回去把羊带过来。
一旦狼把羊带过河后,狼就会立刻把羊吃掉。
所以,这个问题似乎无解。
突然,狼想到了一个办法:它可以把羊载到对岸后,再回来带草过来。
这样,狼和草可以留在一起,而羊则在对岸,不会被狼吃掉。
于是,狼先把羊载到对岸,再回去带草过来。
当狼把草载到对岸后,它发现羊和草都安全地在对岸等待。
狼感到非常高兴,因为它成功地解决了这个难题。
从此以后,狼、羊和草就常常一起过河,它们彼此之间互相信任,共同生活在一起,幸福快乐地度过了每一天。
这个故事告诉我们,解决问题并不一定需要牺牲他人的利益,而是要想办法找到一个让所有人都得到益处的方法。
只有通过合作和信任,才能创造出更美好的未来。
愿我们都能像狼、羊和草一样,共同努力,共同进步,创造更加美好的明天!第二篇示例:从前,有一只狼、一只羊和一捆青草需要过河。
它们来到了一条湍急的河流旁边,狼和羊都不会游泳,因此它们需要找到一种方法来快速而安全地过河。
狼心怀不轨,一直想吃掉羊,因此它必须小心翼翼地确保羊和草都能安全地过河。
但在同时只能运载一个物品的条件下,狼该如何解决这个难题呢?狼想了想,于是提出了一个解决方案。
它告诉羊说:“我会先帮你把草送到对岸,然后再回来接你。
在这期间,你要保持警惕,不要离开草地。
”羊听完后心怀信任,默默地点了点头。
狼将青草背在了背上,开始小心翼翼地游向对岸。
湍急的河水声响不断,但狼仍然努力保持平衡,确保草不受任何伤害。
“过河”问题的解法

“过河”问题的解法陕西省西安市长安区第二中学杨西武【关键词】迪克斯特拉算法,图论,最短路径【内容提要】信息学奥林匹克竞赛,各类资料中都涉及“过河”一题,但都没有给出详解及程序。
历届考题也没有涉及到,原因是其测试数据不便给出多组。
但此题对考察学生的分析能力和解题能力却很有帮助。
本文旨在给出其详解。
【问题描述】某人m带一只羊s,一只狼w和一筐白菜v过河。
没有船,他每次游过河时只能带一件东西,当没有人管理时,狼和羊不能相处,羊和白菜不能相处。
在这些条件的约束下,他怎样才能将三件东西从左岸带往右岸?试编程给出一组过河次数最少的方案。
【问题分析】用无向图描述上述问题的解法路径用结点代表状态例如:初始状态v1可记为{}>Φ<,,,,vwsm(即,人、羊、狼、白菜皆在左岸,右岸为空,这是一种安全状态,即满足约束条件的状态)。
最终状态v10可记为{}>Φ<vwsm,,,,;当人和羊过河后的状态可记为{}{}><smvw,,,(即,狼和白菜在左岸,人和羊在右岸,这也是一种完全状态)。
可根据约束条件写出所有的安全状态:即:①{}>Φ<,,,,vwsm②{}{}><smvw,,,③{}{}> <svwm,,,④{}{}> <wvsm,,,⑤{}{}> <vwsm,,,⑥{}{}> <vwsm,,,⑦{}{}> <vwms,,,⑧{}{}> <vsmw,,,⑨{}{}><w s m v ,,,⑩{}>Φ<v w s m ,,,,将这些安全状态分别用结点v1v2……v10表示若结点vi 经过一次过河可以到达结点vj ,则可以认为vi 和vj 之间有一条边,于是可以得到如下无向图:从v1到v10的一条路径,即表示该题的一种解法求过河次数最少的的方案也就是该图的一条最短路径【算法】①模拟题意,找出所有安全状态(见过程starter )②模拟题意,找出各结点之间的关联,即建立图(见过程create )③用迪克斯特拉算法,求出最短路径并打印。
农夫带着狼、羊和一棵白菜过河
农夫带着狼、羊和一棵白菜过河
描述:
一个农夫带着一只狼、一只羊和一棵白菜来到河边。他需要把它们用船带到河对岸。然而,这艘船只能容下农夫本人和另外一样东西 (要么是狼、要么是羊,要么是白菜)。如果这个农夫不在场的话,狼会吃掉羊,羊也会吃掉白菜。请为农夫解决这个问题,或证明它误 解。
解答:
一边 河
另一边
人,羊,狼,白菜 |||||
狼,白菜 ||||| 人,羊
人,狼,白菜 |||||
羊
白菜 |||||
人,狼,羊
人,羊,白菜 |||||菜
人,羊 |||||
狼,白菜
|||||
人,羊,狼,白菜
成功.........
狼和小羊问题设计
狼和小羊问题1. 引言狼和小羊问题是一个经典的逻辑推理题,涉及到一只狼、一只小羊和一艘只能容纳两个物体的小船。
目标是将狼、小羊和农夫从一边安全地运送到另一边,但有一些限制条件需要遵守。
本文将详细介绍这个问题的背景、规则以及解决方法。
2. 背景在一个假设的场景中,有一个河流,河流两岸各有一块草地。
在河流的一侧,有一个农夫、一只狼和一只小羊。
他们希望过河到达对岸的草地。
然而,小船只能容纳农夫和另外一个物体(即狼或小羊)。
如果农夫不在场时,狼会吃掉小羊;而如果小羊不在场时,狼会吃掉农夫。
3. 规则为了解决这个问题,我们需要遵守以下规则: - 农夫可以单独驾驶船只; - 农夫可以带着其中一个物体(狼或小羊)过河; - 如果农夫离开,狼和小羊不能在一起; - 如果农夫不在场,狼会吃掉小羊; - 如果农夫不在场,小羊会被狼吃掉。
4. 解决方法为了解决这个问题,我们可以采用以下步骤: 1. 农夫带着小羊过河,将小羊放到对岸的草地上; 2. 农夫返回原来的一侧; 3. 农夫带着狼过河,将狼放到对岸的草地上; 4. 农夫将小羊带回原来的一侧; 5. 农夫再次带着小羊过河,将小羊放到对岸的草地上; 6. 最后,农夫返回原来的一侧,将船只驶过河流。
这样就成功地将农夫、狼和小羊都安全地运送到了对岸的草地。
5. 分析通过以上步骤的分析可知,在每次过河时,我们需要确保以下条件成立: - 小羊和狼不同时在一侧(即农夫不在场时); - 小羊和农夫不同时在一侧(即狼不在场时)。
如果满足以上两个条件,狼和小羊就不会发生冲突,可以安全地过河。
6. 拓展问题除了狼和小羊问题,还有一些类似的拓展问题,例如: - 狼、小羊和白菜问题:在原有的基础上增加了一颗白菜,需要将农夫、狼、小羊和白菜都安全地运送到对岸的草地。
- 狼、小羊、白菜和老虎问题:在原有的基础上增加了一只老虎,需要将农夫、狼、小羊、白菜和老虎都安全地运送到对岸的草地。
这些拓展问题在逻辑推理方面提供了更大的挑战,并且可以通过类似的方法进行解决。
趣味数学五年级2
智力趣题“公鸡不能生蛋” 从前有一个国王,暴虐任性。一次,他对一位大臣说: “我吃的鸡蛋都是母鸡生的,现在想尝尝公鸡蛋的滋味,命令你三天内把公 鸡蛋找来,我将重赏你;如果三天内找不到公鸡蛋,我就要在第四天的早晨处死 你。” 大臣知道厄运将至,但又不敢公开违抗,只有悲伤地离开了朝廷。 三天过去了,大臣无法找到公鸡蛋。最后的一个夜晚,他显得异常烦躁。大 臣的小儿子是一个很聪明的少年,看到爸爸如此焦急,知道一定是大祸临头了。 便问道: “爸爸有什么烦闷的事呢?” “你小孩子家,我讲了又有什么用?”大臣有气无力地回答。 “不,爸爸!告诉我吧,或许我能为你分忧。”少年紧握爸爸的双手,使劲 地摇晃着。 大臣深情地望着自己的孩子,终于说出了事情的原委。少年沉思了一会,劝 爸爸不要着急,他有办法逢凶化吉。
0个关于渡河过桥的数学题 A组: 1.老王体重150斤,他去山上打柴,共打了两捆,每捆重70斤。 老王回家要经过一座小桥,小桥只能载重200斤,请你给他想个办 法,让他一次安全地过河去。 2.有人要过桥,桥中有看守,看守每5分钟出来巡视一遍,然后 回屋打盹。但他巡视时,发现有人从桥东往西走,就赶回桥西。 这人过桥至少要7分钟。请你想办法帮他过桥? 3.一只船在河中行驶,来到一座桥下时,船上的货物高出桥面底 部3厘米,无法通过。现在不准移动货物,你可以想出办法,使船 安 全通过桥底吗?
B组: 7.第一次装运34只到对岸卸下33只,留一只带回东岸;第二次又装上33 只,加上船上原有的一只,共34只运到对岸,卸33只,留一只带回东岸;第 三次把最后33只装上船,一同运到西岸(解法不唯一); 8.一步:两个小孩划到对岸,一个孩子上岸。二步:另一个孩子把船划 回来,他上岸。三步:一个士兵把船划到对岸,他上岸。四步:留在对岸的 孩子把船划回来。五步:两个孩子再把船划到对岸,重复这种步骤,直到把 全部士兵渡过河为止; 9.第一次A、B过(按慢艇速度)留A、B回,4分钟。第二次C、D过,A回,7 分钟。第三次A、B过,2分钟。至少需要13分钟(此法不唯一,答案唯一); 10.如下图所示,将两条木板搭接起来,由甲压住放在下面的木板的一端, 使乙通过。然后乙站在甲的位臵上,使甲通过。这是巧妙利用了杠杆原理。
C语言-人狼羊菜问题-最容易看懂的解决方法及代码
C语⾔-⼈狼⽺菜问题-最容易看懂的解决⽅法及代码题⽬描述:农夫需要把狼、⽺、菜和⾃⼰运到河对岸去,只有农夫能够划船,⽽且船⽐较⼩,除农夫之外每次只能运⼀种东西,还有⼀个棘⼿问题,就是如果没有农夫看着,⽺会偷吃菜,狼会吃⽺。
请考虑⼀种⽅法,让农夫能够安全地安排这些东西和他⾃⼰过河。
想这个问题⼀连想了好⼏天,本⼈没有系统的学过算法,有些概念也不是很清楚,只因解决问题为⽬标。
尝试过图论解决,但⽤floyed算法只能算出最短路径值,如何输出过程,⼀直没想出好的解决⽅法。
然后看了下⾯这篇⽂章,尝试抛弃图论,⽤树的思想来解决这个问题。
建议阅读下⾯代码时,先看看这篇⽂章。
在写代码时,本⼈采⽤了上述⽂章中的思想,⼜借鉴了图论中存储结点的⼀些⽅法。
我觉得这样写应该⾮常容易看懂了。
具体思路见代码。
1 #include <stdio.h>2#define INF 99993//8个动作4char *action[8]={"农夫单独过河","农夫带狼过河","农夫带⽺过河","农夫带菜过河",5"农夫单独返回","农夫带狼返回","农夫带⽺返回","农夫带菜返回"};6//10种状态7char *state[10]={"⼈狼⽺菜","⼈狼⽺","⼈狼菜","⼈⽺菜","⼈⽺","狼菜","狼","⽺","菜","空"};89//状态转换规则:GA[i][j]=k 表⽰【状态i】可以通过【动作k】转换到【状态j】,GA[i][j]=INF表⽰不可直接转换10int GA[10][10]={INF,INF,INF,INF,INF, 2,INF,INF,INF,INF,11 INF,INF,INF,INF,INF,INF, 2, 1,INF,INF,12 INF,INF,INF,INF,INF, 0, 3,INF, 1,INF,13 INF,INF,INF,INF,INF,INF,INF, 3, 2,INF,14 INF,INF,INF,INF,INF,INF,INF, 0,INF, 2,156,INF, 4,INF,INF,INF,INF,INF,INF,INF,16 INF, 6, 7,INF,INF,INF,INF,INF,INF,INF,17 INF, 5,INF, 7, 4,INF,INF,INF,INF,INF,18 INF,INF, 5, 6,INF,INF,INF,INF,INF,INF,19 INF,INF,INF,INF, 6,INF,INF,INF,INF,INF};2021//记录每⼀步的动作22int record_action[20];23//记录每⼀步动作后的状态24int record_state[20];2526//搜索从第step步开始、第i个结点到第n个结点的过程(step从0算起)27void search(int i,int n,int step)28 {29int k;//动作30int j;//可能要转换到的状态31if(i==n)32 {33for(k=0;k<step;k++)34 printf("step %d: %s,左岸还剩 %s\n",k+1,action[record_action[k]],state[record_state[k]]);35 printf("step count:%d\n\n",step);36return;37 }38//查找在当前【状态i】下能转换到的【其它状态j】,并且【状态j】不能在之前出现过39//查找时可能会出现多个 j,所以这是⼀个多叉树40for(k=0;k<8;k++)41 {42for(j=0;j<10;j++)43if(GA[i][j]!=INF&&GA[i][j]==k)//判断状态i能否通过动作k转换到状态j44 {45int m;46//下⾯这个循环是判断状态j在之前是否出现过47for(m=0;m<step;m++)48if(j==record_state[m])break;49if(m<step)continue;50//如果j满⾜前⾯所有条件,则记录这⼀步51 record_action[step]=k; //第step步所使⽤的动作52 record_state[step]=j; //第step步所转换的状态53 search(j,n,step+1); //继续搜索下⼀步54 }55 }5657 }58int main()59 {60 search(0,9,0);61return0;62 }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
//过河,使用广度优深算法遍历
int crossRiver(int result[]){
int Status,nextStatus,choice[]={8,9,10,12};//农夫从某一状态出发,有4种走法
int queue[16],front,rear;//定义循环队列
return (0!=(n & 2));
}
int grass(int n){
return (0!=(n & 1));
}
//安全检验
int isSafe(int n){
if(sheep(n)==grass(n) && sheep(n)!=man(n)) return 0;
if(sheep(n)==wolf(n) && wolf(n)!=man(n)) return 0;
1人不在时: 三个全不在的 (1,1,1,1)
两个不在的 (1,1,1,0)、(1,1,0,1)、(1,0,1,1)
一个不在的 (1,0,1,0)
② 人在时: 三个全在的 (0,0,0,0)
一个不在的 (0,0,0,1)、(0,0,1,0)、(0,1,0,0)
两个不在的 (0,1,0,1)
一共有10种状态。
在河的一岸,人、狼、羊、草、均要过河,船需人划,而且最多载一物,当人不在时,狼会吃羊,羊会吃草;试安排人狼羊草安全渡河。
一、分析问题
人带着狼、羊和草,身处河的一岸。他要把这些东西全部运到彼岸。问题是他面前只有一条小船,船小到只能容下他和一件物品,另外船必须有人划。而且,因为狼能吃羊,而羊爱吃草,所以人不能留下羊和草或者狼和羊单独在河的一边。以下是解决方案:
五、程序代码
#include<iostream>
using namespace std;
int man(int n){
return (0!=(n & 8));//判断农夫在不在,如果返回1,则表示农夫在。
}
int wolf(int n){
return (0!=(n & 4));
}
int sheep(int n){
(1,1 ,1,0 ) +(1, 0, 1, 0)=(0,1,0,0) +
(1, 0 , 0 , 1)=(0,1,1,1) !
(1 , 0 ,0 ,0 ) =(0,1,1,0) !
(5)1 (1 , 1 ,0 , 0 ) =(1,0,0,0) !
(0,1,0,0 ) +(1, 0, 1, 0)=(1,1,1,0) *
状态转移方程:原状态㈩运载=现状态
一可取状态向量㈩可取运载向量,称之为过河。
其中㈩运算方式为“1+1=0,1+0=1,0+1=1,0+0=0”。
二、建立模型
在规则“1+1=0,1+0=1,0+1=1,0+0=0”下,
试求从最初可取状态向量(0,0,0,0)经过N步到最终状态向量(1,1,1,1)的可取转移方式。
广度优先的含义就是在搜索过程中总是首先搜索下面一步的所有可能状态,然后再进一步考虑更后面的各种情况。
要实现广度优先搜索,一般都采用队列作为辅助结构。把下一步所有可能达到的状态都列举出来,放在这个队列中,然后顺序取出来分别进行处理,处理过程中把再下一步的状态放在队列里。由于队列的操作遵循先进先出的原则,在这个处理过程中,只有在前一步的所有情况都处理完后,才能开始后面一步各情况的处理。
(1,0,1,1) + (1, 0, 1, 0)=(0,0,0,1) +
(1, 0 , 0 , 1)=(0,0,1,0) *
(1 , 0 ,0 ,0 ) =(0,0,1,1) !
(5)2 (1 , 1 ,0 , 0 ) =(1,1,0,1) +
(0,0,0,1 ) + (1, 0, 1, 0)=(1,0,1,1) *
int i,j,visited[16];//visited[i]=0表示i未访问过
int route[16];//route[i]表示第i步的前一步,意即往第i步走的方式
rear=front=0;//队列初始化
for(i=0;i<16;i++){
route[i]=-1;
visited[i]=0;
}
Status=0;nextStatus=-1; //从状态0(全部在南岸)开始
if(visited[nextStatus]==0 && isSafe(nextStatus)){
queue[rear]=nextStatus; rear=(rear+1)%16;//入队
route[nextStatus]=Status;//仅表示从Sattus可以走到nextStatus
//如route[10]=0,意即从0000有路可走到1010
(1, 0 , 0 , 1)=(1,0,0,0) !
(1 , 0 ,0 ,0 ) =(1,0,0,1) !
得到的可取状态和(5)1步骤一样,故运算(6)2、(7)2应该和(6)1、(7)1一样。所以总共可以通过七步运算使得人、狼、羊、草安全过河。
四、算法实现
1.问题分析
完成了上面的准备工作,要模拟农夫过河问题,首先需要选择一个对问题中每个角色的位置进行描述的方法。一个很方便的办法是用四位二进制数顺序分别表示人狼羊草的位置。例如用0表示人或者某物在河的南岸,1表示在河的北岸。因此整数3(其二进制表示为0011)表示人和狼在河的南岸,而羊和草在河的北岸。
queue[rear]=Status; rear=(rear+1)%16;//入队
while(front!=rear){
Status=queue[front];front=(front+1)%16;//出队
visited[Status]=1; //访问
for(j=0;j<4;j++){
nextStatus=Status^choice[j]; //从curStatus状态到下一状态nextStatus
现在的问题变成:
从初始状态二进制0000(全部在河的南岸)出发,寻找一种全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸)为最终目标,并且在序列中的每一个状态都可以从前一状态通过人(可以带一样东西)划船过河的动作到达。
2.算法选择
求解这个问题的最简单的方法是一步一步进行试探,每一步都搜索所有可能的选择,对前一步合适的选择再考虑下一步的各种方案。
用计算机实现上述求解的搜索过程可以采用两种不同的策略:一种是广度优先搜索,另一种是深度优先搜索。
深度优先搜索就是在搜索树的每一层始终先只扩展一个子节点,不断地向纵深前进直到不能再前进(到达叶子节点或受到尝试限制)时,才从当前节点返回到上一级节点,沿另一方向又继续前进。这种方法的搜索是从树根开始一枝一枝逐渐形成的。
人然后是B状态,B状态表示用船渡河过程中表示船内运载的状况,当一物在船上时用1表示,不再船上则用0表示,当满足问题条件的运载称为可取运载,当不满足条件的运载则是不可取运载,如B1(1,1,0,0)表示人狼崽船上,但它不是可取状态,同样B2(1,0,1,1)也不是可取状态,应为船不能载三物。
我们可以通过穷举法得到可取状态向量:
(0,0 ,1,0 ) + (1, 0, 1, 0)=(1,0,0,0) !
(1, 0 , 0 , 1)=(1,0,1,1) +
(1 , 0 ,0 ,0 ) =(1,0,1,0) *
第三步中得到的结果有两个可取状态,故应分别计算
先取(1,1,1,0)计算:
(4)1 (1 , 1 ,0 , 0 ) =(0,0,1,0) *
三、解法
1.穷举法
注:在得到的状态后面的标示符中,“!”表示该状态不可取,“+”表示该状态可取,“*”表示该状态已经出现过,为重复状态。
(1)(1,1,0,0)=(1,1,0,0)!
(0,0,0,0) +(1,0,1,0)=(1,0,1,0)+
(1,0,0,1)=(1,0,0,1)!
(1, 0, 0, 0) =(1,0,0,0)!
深度优先搜索亦称为纵向搜索。由于一个有解的问题树可能含有无穷分枝,深度优先搜索如果误入无穷分枝(即深度无限),则不可能找到目标节点。所以,深度优先搜索策略是不完备的。另外,应用此策略得到的解不一定是最佳解(最短路径)。
深度优先搜索算法中,是深度越大的结点越先得到扩展。如果在搜索中把算法改为按结点的层次进行搜索,本层的结点没有搜索处理完时,不能对下层结点进行处理,即深度越小的结点越先得到扩展,也就是说先产生的结点先得以扩展处理,这种搜索算法称为广度优先搜索法。
(7)1 (1 , 1 ,0 , 0 ) =(1,0,0,1 ) !
(0,1,0,1 ) + (1, 0, 1, 0)=(1,1,1,1) +
(1, 0 , 0 , 1)=(1,1,0,0) !
(1 , 0 ,0 ,0 ) =(1,1,0,1) *
取(1,0,1,1)计算:
(4)2 (1 , 1 ,0 , 0 ) =(0,1,1,1) !
整个过程中我们把该过程分为两种状态A和B,在各状态中,将人羊狼草用一个四维向量表示,A状态表示人羊狼草在河的左右岸的状态,当一物在左岸时,用分量0表示,当一物在右岸时,用分量1表示,例如状态A1(1,1,0,1)表示人羊草在河的右岸,狼崽河左岸,根据题中的要求,有些状态时允许的,有些状态是不允许的,这就牵涉到该方案的安全性,于是我们规定由条件允许存在的状态我们称之为可取状态,比如A1(0,1,0,1)是一个可取状态,而A2(0,0,1,1)则是一个不可取状态,因为他表示羊草在河的右岸,是不可取的;