[摩尔庄园]庄稼快速浇水算法

#引子

最近在肝摩尔庄园手游,最吸引我的不是各种剧情任务,而是家园的种菜收菜(可能逃不过码农的宿命。。。)
[摩尔庄园]庄稼快速浇水算法_第1张图片

令我感到厌倦的是每次播种完需要再浇水,不过种植等级到达10级之后,新升级的铜水壶可以一次浇三个连续的格子
[摩尔庄园]庄稼快速浇水算法_第2张图片

在无聊且上瘾的浇水过程中,对着我佛系且随性种的菜发呆的时候,突然想到了一个问题:怎样设计策略用最少的次数浇完所有的植物呢?

案例分析

对于我们的庄园,可以看成是一块m*n的地基
[摩尔庄园]庄稼快速浇水算法_第3张图片

植物呢,随机分布在每一块地基上,我们就可以把它抽象成一个二维数组与元素值0或1(代表植物有无)每一次浇水,将所覆盖到的范围元素值全部变为0,设计一个算法,求出当该二维数组全为0的时候,操作次数的最小值
[摩尔庄园]庄稼快速浇水算法_第4张图片
示例图写1和0不太直观,先用⭕️代表

算法分析

最开始头绪很乱,想了想是否可以通过分析每一种情况的树,直接用数学方法算出来,后来放弃了这个念头。走在去足球课的路上,突然想到了数电学的K-MAP,是否可以以此为参照呢

1⃣️我们定义植物的“集群”:某树在上下左右四个方向的两格内如果存在另一棵树的话,则这几个连续的格子成为树的一个“集群”
[摩尔庄园]庄稼快速浇水算法_第5张图片
比如说对于上文举的例子,先划分“集群”:
[摩尔庄园]庄稼快速浇水算法_第6张图片
2⃣️消除”突出部分“
我们定义“突出部分”:在一个大集群内,设在集群内且没有种树的土地为“无关项”,如果有的树仅有一个相邻树或无关项,则称为“突出部分”。

在栗子中我们标黄表示
[摩尔庄园]庄稼快速浇水算法_第7张图片
现在,以突出部分为水壶浇水的边缘向内浇水!并且给孤立的集群浇水(孤立的集群:单个或者两个树按行或者列排列起来,只需一次浇水就可以全部覆盖)[摩尔庄园]庄稼快速浇水算法_第8张图片

下面要做的,就是将浇过水的树清零,然后递归1⃣️2⃣️步骤:
[摩尔庄园]庄稼快速浇水算法_第9张图片
所以此例最小浇水次数为7。

代码先欠着,考完马原再更新

//input:每棵树的坐标
//output:浇水方法与最少浇水次数

你可能感兴趣的:(算法设计与分析)