这是一个平面涂色问题,开始我打算分析着做,结果WA了,说明分析中没考虑周全,看来只能枚举或搜索 ,由于不得要 领,无从下手,只好找资料。
发现此题的两种做法:
1,由于平面涂色只用四种颜色就够了,这样可以枚举各种情况,由于数据量不大,是可行了。先用邻接矩阵将数据获得。如果没有区域邻接,则为1,这种情况最为简单;如果出现四个区域,每个区域都与其他三个邻接,则要用4种颜色;如果有三个区域两两邻接,要用三种颜色;如果存在两个区域邻接的情况,要用2种颜色。但是这种方法不能处理不合理的数据,例如:
A:BCDE
B:ACDE
C:ABDE
D:ABCE
E:ABCD
这样会返回4,事实上这样的情况是不合逻辑的,在平面上无法画出这样的情况,poj的数据也没有类似的。所以这种方法是可行了。由于枚举过程比较耗时,但数据量较小,用去了16MS,如果数据量大了则时间成倍上涨,不是优先选择的方法。具体见代码:
其实这种题正常应该用DFS做,由于对DFS了解甚少,看别人的代码也稍微明白。由于知道最多只能用4种颜色,则可从头开始对每种可行的颜色进行尝试,一旦发现4种颜色不够则一定是数据有错可直接截断,具体见代码:
但经反复思考,发现这并不是DFS, 而是贪心,能过说明数据太弱,如:
6
A:BEF
B:AC
C:BD
D:CEF
E:ADF
F:ADE
正确的应该是3 A(1)B(2)C(3)D(1)E(2)F(3)
就过不了,所以这种方法是错误的。
那真正的DFS应该怎么做呢?
想了一段时间,改了改,感觉DFS暴搜应该是这样的:
先将第一个区域涂为1,这是确定的,然后搜出每一种可能的情况,
每搜完一回比较一下当前的情况是否比记录的小,记录的初始化为4。
这样也是16MS,也许和前边那个枚举的效率差不多