一、引言
最近,有位朋友有道有意思的题找我看看,正好最近也闲,也就看了看,做了四个多小时,觉得非常有趣。
这是一道什么题目呢?
输入一系列字符阵列,将这些字符阵列每一种看做是一个区域,将每个区域进行着色(也就是替换成四种符号显示),要求每个区域相邻之间不能有相同的颜色。
题意其实不用深究,看到这里也就大概懂了,我们手上得到了一个二维数组,都是字符的,然后一种字符代表一个区域,然后我们要用四种颜色区分这些区域,要求不能相邻区域使用同样的颜色。
数学上有一个非常著名的猜想,叫做“四色猜想”:
四色定理(世界近代三大数学难题之一),又称四色猜想、四色问题,是世界三大数学猜想之一。四色定理的本质许多人认为是在平面或者球面无法构造五个或者五个以上两两相连的区域。
这也是这道题为什么指定只需要 4 种颜色的原因,因为 4 种颜色足足够了。
二、算法如何实现?
思考了很久,最后的实现策略如下:
首先需要遍历这个二维数组,获得 “字符” 到 “相邻字符数组”的映射关系
记录当前字符的相邻字符们用掉的颜色(因为相邻不能相同,所以相邻字符用掉的颜色不可以再使用),取第一个可以使用的颜色作为当前字符的颜色值
检查当前字符的相邻字符是有有未着色的字符点,如有的话,则将此相邻字符看作当前字符,进入步骤 2