Swift 求正六边形网格中颜色相同且相邻的正六边形数量(递归)

如图所示,蓝色正六边形族的数量应该是 4 和 2。

下面介绍 Swift 代码的实现办法。

首先为正六边形进行编号,如图:

再为每个正六边形关联相邻的六边形,例如

  • 1 - 2, 3, 4
  • 2 - 1, 4, 6

关联好之后,以 1 号六边形为例:

  1. 将 1 号加入 check 数组 -> [1]
  2. 遍历 check 数组,将 1 号加入 blue 数组 -> [1];将 1 号加入 checked 数组 -> [1]
  3. 将 1 号关联六边形加入 check 数组 -> [2, 3, 4]
  4. 遍历 check 数组,提取蓝色正六边形 -> 3, 4,将其加入 blue 数组 -> [1, 3, 4],将 check 数组元素移至 checked 数组 -> [1, 2, 3, 4]
  5. 将 3, 4 号的关联六边形加入 check 数组 -> [1, 4, 5, 7, 1, 2, 3, 6, 7, 8]
  6. check 数组去重 -> [1, 2, 3, 4, 5, 6, 7, 8]
  7. 去除 check 数组与 checked 数组交集元素 -> [5, 6, 7, 8]
  8. 遍历 check 数组,提取蓝色正六边形 -> 6 ……

可以发现,checked 数组的元素从 1 号开始,是一层层随着颜色往外遍历的。

编写成递归代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
func blueHexagonCount(check: [Hexagon]) -> [Hexagon] {

var checked: [Hexagon] = [] // 存放遍历过的六边形
var result: [Hexagon] = [] // 存放颜色相同且相邻的六边形

return checking(check: check)

func checking(check: [Hexagon]) -> [Hexagon] {

var target: [Hexagon] = [] // 临时存放颜色相同的六边形

for hexagon in check {
if hexagon.color == .blue {
target.append(hexagon)
}
}

checked += check

if target.count == 0 {
return result
}

else {

result += target

var relation: [Hexagon] = [] // 存放与 target 中六边形相邻的六边形
for hexagon in target {
relation += hexagon.relations
}

relation = relation.removeDuplicate()

for h1 in checked {
for h2 in relation {
if h1 == h2 {
relation.removeAll(where: { $0 == h2 }) // checked 中的六边形不再 checking
}
}
}
return checking(check: relation)
}
}
}

Swift 求正六边形网格中颜色相同且相邻的正六边形数量(递归)
https://wonderhoi.com/2024/12/12/Swift-求正六边形网格中颜色相同且相邻的正六边形数量/
作者
wonderhoi
发布于
2024年12月12日
许可协议