农民过河算法可爱的学习----记录于高考报名后的怀旧emo时刻--穷举算法
很多关卡在向孩子教学代码的同时,更是在潜移默化地训练孩子的编程思维。
在最开始的地牢地图中,孩子需要使用「While-True」循环语句,穿过一个又一个结构重复的迷宫。
在学习「While-True」循环语句的同时,也在训练着使用「循环思维」解决重复问题的能力:
发现并拆解重复部分
解决重复问题
循环运行问题的解决方法
这样,就能只用一段代码,高效地解决重复问题了。
可见,在编程中,学习代码的编写只是基本,更重要的还是掌握运用代码的编程思维。
农民过河问题
在编程的数道经典算法问题中,有一个「农夫过河」问题:
一个农夫带着一只狼,一只羊和一些菜过河。河边只有一条船,由于船太小,只能装下农夫和他的一样东西,在无人看管的情况下,狼要吃羊,羊要吃菜,请问农夫如何才能使三样东西平安过河。
为了用代码解决这个问题,程序员需要利用「穷举搜索思想」,尝试所有的过河方案,直到找出正确的过河方案。
而在极客战记中,也有着类似的一关。
「士兵,食人魔和农民」
关卡地址:
https://codecombat.163.com/play/level/soldier-ogre-and-peasant?
关卡介绍:
你需要使用狮鹫,把士兵、食人魔、农民,带去河的对岸,狮鹫每次只能带一个人离开,而食人魔会伤害农民,士兵会攻击食人魔,因此不要让士兵和食人魔单独留在一起,也不要让食人魔和农民单独留在一起。
这一关是和「农夫过河」同类型的问题,就像一个脑筋急转弯,不用代码,用我们的智慧,动动脑筋,应该很快就能想出解法。
但你能想出一种解法,如果你想找出所有的解法,是不是就有一定的难度了呢?如何更快更全地找出所有的过河方法呢?
在本关,我们可以学习一下如何使用「穷举思想」解决编程问题。
穷举是什么?
穷举是什么呢?它有着一个高大上的名字,但它的本质却十分的简单朴实。
穷举法的基本思想:根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。
简单来说就是:把所有的答案都试一遍,找出正确的答案。
非常的简单粗暴。
因此,它也是编程常用中效率较低的一种算法。
使用穷举法,通常需要三步:解析题目——优化运算过程——开始穷举。
我们来试试利用穷举法解决关卡「士兵,食人魔和农民」吧!
第一步:解析题目
穷举法的第一步就是分析题目,把原本的文字题目,转化成更易于分析,简洁有逻辑的题目类型。
① 题目的对象
题目看似只是三个人的过河问题,但实际上在题目里有四个人物:狮鹫、士兵、食人魔、农民。狮鹫负责帮助大家过河。
② 题目的条件
一、士兵和食人魔不能单独留在一起;
二、食人魔和农民也不能单独留在一起。
也就是说,当狮鹫、士兵、食人魔呆在一起的时候,也不会发生问题,因为士兵和食人魔马上就要被狮鹫运走,来不及打架。
③ 题目的状态
我们需要使用狮鹫来帮助他们从右边飞到左边,因此题目具有以下几种可能发生的情况:
左边有士兵、食人魔、农民、狮鹫,右边什么都没有。
左边有食人魔、农民、狮鹫,右边有士兵。
左边有农民、狮鹫,右边有士兵、食人魔。
……等等多种情况
④ 优雅地表示题目
可以看到,用文字标识题目可能发生的情况,十分地复杂。因此,在编程中,我们常常会用一些特定的符号来简洁地表达题目可能发生的情况。
看看题目,人物只会有两种状态,在右边(还没过河),在左边(过河了),因此我们可以直接用0、1来表示人物的位置。
0表示还没过河;1表示已经过河。
那么就可以这样表示:(狮鹫、士兵、食人魔、农民)
(1,1,1,1)表示所有人物都已过河,到了左边。
(1,0,1,1)表示食人魔和农民过了河,士兵还没有。
……等等
用这种简洁的方式,把题目的所有情况表示出来就是:
共16种状态。
根据题目的条件,我们可知,有以下几种情况是不可取的:
农民和食人魔单独在一起:(0,0,1,1)、(1,1,0,0)
士兵和食人魔单独在一起:(0,1,1,0)、(1,0,0,1)
还有两种隐含的不可取条件:
只有狮鹫自己在一边:(1,0,0,0),这表示,所有人都没过河,只有狮鹫过河了,而狮鹫本来就是帮助大家过河的,不可能自己单独呆在河的一边。所以这种情况是不会发生的。
那么同理还有:(0,1,1,1)这种情况,所有人都过了河,狮鹫没有过河,这也不会发生。
那么本题的问题就变成了:
如何在符合条件的情况下,把(0,0,0,0)转化成(1,1,1,1)。
把题目转化成一个易于分析的题目类型,这才是穷举法的开始。
而穷举法的魅力,还不在这里,它能够帮助我们更快更全地找出问题的所有结果,究竟我们要如何对这个题目进行穷举呢?
编程解决算法问题「农民过河」,穷举思想轻松学(二)将会为你揭秘!
农民过河算法可爱的学习----记录于高考报名后的怀旧emo时刻--穷举算法相关推荐
- 穷举算法——奶牛碑文(cow)
- 穷举算法--奶牛碑文(cow) 题目描述 小伟暑假期间到大草原漫游,在一块石头上发现了一些有趣的碑文.碑文似乎是一个神秘古老的语言,只包括三个大写字母 C.O 和W. 尽管小伟看不懂,但是令他高兴 ...
- 穷举算法(鸡兔同笼问题)
穷举算法的基本思想就是从所有可能的情况中搜索正确的答案,其执行步骤如下: (1)对于一种可能的情况,计算其结果. (2)判断结果是否满足要求,如果不满足则进行执行第(1)步来搜索下一个可能的情况:如果 ...
- 百钱百鸡php穷举法,PHP经典题:百钱百鸡问题(穷举算法)
PHP经典题:百钱百鸡问题(穷举算法) 百钱百鸡问题: 已知:公鸡5元一只,母鸡3元一只,小鸡一元3只 现用100元钱买了100只鸡,问:公鸡母鸡小鸡各几只? --请考虑尽可能高效的方法 思路: 如果 ...
- 简析穷举算法,及其简单应用
简析穷举算法,及其简单应用 穷举概述 穷举法又称列举法,其基本思想是逐一列举问题所涉及的所有情况. 穷举法常用于解决"是否存在"或"有多少种可能"等问题. 应用 ...
- 3388=24及24点游戏的穷举算法
偶尔看到一题:用3 3 8 8 四个数和加减乘除组合得出24,前提是用完这四个数,几年没好好思考了,偶算了半天没答案,就写了个穷举算法,呵呵,貌似结果只有一种啊,各位兄台还有其它答案么? packag ...
- java穷举密码_穷举算法和递推算法(Java)
穷举算法 概念: 最简单算法,依赖计算机的强大计算能力穷尽每一种可能的情况.穷举算法效率不高,但是适合一些没有明显规律可循的场合. 思想: 在使用穷举算法时,需要明确问题答案的范围,这样才可能在指定范 ...
- 《我的第一本算法书》 - 学习记录
目录 0. 算法基础知识 0-1. 什么是算法 0.1.1 算法和程序的区别 0.1.2 排列整数的算法:排序 0.1.3 如何选择算法 0-2. 运行时间的计算方法 0.2.1 输入数据的量和运行时 ...
- 子图同构算法——Ullmann算法(1)不包含refine procedure的简单穷举算法。
摘要: 转载请注明来自stanlysheng--talk is cheap, show me your code.http://www.cnblogs.com/stanly/ .谢谢.此文我也在CSD ...
- 旅行商问题穷举算法c语言,什么是旅行商问题——算法NP、P、NPC知识
旅行商问题 旅行商问题所描述的是这样一个场景: 有一个商品推销员,要去若干个城市推销商品.该推销员从一个城市出发,需要经过所有城市后,回到出发地.每个城市之间都有道路连通,且距离各不相同,推销员应该如 ...
最新文章
- 为什么MySQL数据库要用B+树存储索引?
- 人生的意义—我们为什么活着?
- 京东零售CEO徐雷升任京东集团总裁,刘强东:将把更多时间投入乡村振兴等事业中...
- 关键词为什么迟迟不上首页?太令人“捉急”了!
- IBM:决胜量子计算五大战略!商用近在咫尺
- poj 2503(字符串hash)
- python保存为excel文件_初级Python:在excel文件打开时保存它
- S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A)
- Qt中Q_OBJECT与生成的moc文件的作用
- Opencv中Get2D()与cvSet2D() 的坐标问题
- ES6新特性:Javascript中Generator(生成器)
- Redis分布式锁之:RedLock
- Fedora 安装 WPS
- NumPy 数组属性
- 「干活」基因组组装 学习笔记 - 入门知识点和Genome Survey
- 探索性数据分析(四)——特征工程(对数转换、标准化/归一化、离散化、标签编码、独热编码、Dummy变量)
- opj线性表Placing apples 题解
- tipask 问答系统 如何设置第三方一键登录
- 第六章 DDL语言
- 大青云不显示服务器,《大青云》8月30日合服公告
热门文章
- 关于jsplumb多次点击连接线生成多个连接线的问题
- 深刻!看一个30岁男人对爱情婚姻的思考
- Cocos2D手机游戏开发之优化篇
- 获取cookie php,php怎么获取cookie呢?
- 如何有效建立客户关系,提高复购率与客户的终生价值
- golang windows程序获取管理员权限(UAC )
- 如何通过canvas 把页面代码转化为图片
- 函数习题(8):递归方法求n阶勒让德多项式的值
- 天津计算机一级成绩查询入口,天津计算机一级考试成绩查询入口
- 用户输入的是q么python_Python 第1周 - Python基础-python入门\变量\用户输入\循环语句的使用...