地图清理中可以先去掉细小突出,再恢复较大的主体,也可以先填近邻空隙,再收回外层。两种操作顺序不同,得到的图案也可能不同。
用中心格和上下左右四邻格组成十字模板。膨胀把每个占用格及其四邻格都加入;腐蚀只保留十字模板全部落在占用集合中的中心格。开运算是先腐蚀再膨胀,闭运算是先膨胀再腐蚀。
本例的输入和输出
显示窗口六乘六,#表示占用,点表示空白。计算中保留窗口外的中间格子。
原图: #.##.. .##... ####.. ##...# ##..#. #.#.## 占用数量:19 开运算: ...... .#.... ###... .#.... ...... ...... 占用数量:5 闭运算: #.##.. .##... ####.. ###### #####. #.#.## 占用数量:24
表格中的编号只标识当前例子的元素,不应把对象身份、数组下标与计算数值混为一谈。阅读时先核对输入和边界,再沿记录检查每一步;空结果表示规则下没有可用项,并不是默认返回数值零。
复核与适用条件
本例把格子看成无限整数平面上的有限集合,中间结果允许临时越过显示边界,不能把它提前裁掉。开运算结果应包含于原集合,闭运算应包含原集合;重复同一种完整运算应保持结果。
十字模板和三乘三方形模板并不等价,斜角处理尤其不同。它们只是几何清理规则,不理解关卡用途;即使图案更平滑,也仍需检查道路连通和玩家可通行宽度。
练习时先独立复算一小段,再检查整体结果是否满足文中条件。遇到差异应保留中间记录并定位第一处不一致,而不是只调整最后答案。更换输入或操作规则后,需要重新计算,原记录只对这一例负责。
