前言
《啊哈算法的》中第三章,在学习第三章《枚举!很暴力》中,读完炸弹人篇发现和自己曾经做的题是一个类型的。
发这篇blog也是感慨一下,曾经自己想了一下午且认为难过登天的题目,其实就是简单的算法模型。
当然,感到高兴的是,自己曾经琢磨出的思路、方法还是正确的,至少在学习甚少的情况下,居然自己琢磨出了这种“有地图”的题目的一般思路。
一、原题
以下是PDF版本的截图:
问题主要是 炸弹放在那里可以炸死更多的敌人。
二、分析
1.建模
书上的内容太过于精确,既然是我的blog就来用我的理解解释。
这种题目我一般称之为 地图题
其特点在于 和图形相关,并且多借助于老游戏 的设定给出题目背景。
所以都是一块一块的,基本可以做到映射到直角坐标系里面,每个元素均可以由(x,y)坐标来表达。
以上为数学模型,以下开始用编程思维描述
既然想到了直角坐标表达每个元素,那么就可以借助二维数组 来类比直角坐标系,a[ ][ ]就恰好可以模拟x,y。
而为了让程序可以识别,我们必须要修改、简化地图。用一个N*N的字符阵来抽象表达即可。一个字符对应一种元素。
2.解题思路
题目一般都会给出一定的游戏规则,然后让我们对胜利情况进行编程求解。
而这时候就需要把题目翻译为编程语言。
比如在某某范围中、某某直线的某一边…
那这样的话,就完美符合了中学数学的知识。
如果要求在上下左右,就对相应的二维数组下标进行加减(中学的左加右减),如果线非常复杂的话,甚至还需要用到高中所学习的线性规划,来找到边界判断条件。
《啊哈!算法》中的例子较为简单,上方就是x-1书中这个图生动形象地展示了对应关系。
3、遍历寻找
接下来要做的就是进行遍历,由于本次章节讲述的是暴力枚举,所以就需要一个个从地图上找元素是否符合要求(如题意中要求不能放置在某种地方),这种限制条件转换到代码就是在循环条件里面写成 != 之类的判断条件
附:关于边界问题
这类题目一大难点就在于—边界控制。
地图的边界、划定范围的边界,以及可移动目标的边界控制(这个最难)
有时候小于号< 到底要不要加等于号
移动目标在移在移动过程中到底何时要判断、何时不用判断
这都是要考虑的问题。
总结
之前啥算法也没有接触过的时候,在洛谷做的一个题目和这个有着异曲同工之妙,当时苦思冥想了整个周日的下午,还曾懊恼自己做题效率低下,但是如此看来,自己的思考并非没有意义的,还是算自己“碰上”了相对正确的思路,果然编程是磨出来的,自己思考出来的算法会非常的熟悉