读书人

回顾算法-四色图着色

发布时间: 2012-07-19 16:02:19 作者: rapoo

回溯算法---四色图着色

回溯算法基本思想:

判断第一个节点的各个候选值{ //当无未进行判断的候选者时,则退出

当将某候选值赋予第一个节点时,判断此时是否存在一个解路径。

若不存在,则继续判断下一个候选值。

}

具体算法思想如下:

NUM : 解路径上节点的个数

CANDIDATA_NUM: 每个节点的候选值的个数

BOOL TestNode(I,j)

判断当将候选值j赋予节点i时,是否能找到一条解路径

//是否有解

BOOL Find()

{

BOOL bExist=FALSE;

//从起始节点的候选值依次判断

For(int j=0; j<CANDIDATA_NUM;j++)

{

IF(TestNode(0,j))

{

bExist=True;

}

}

Return bExist;

}

四色图问题:

设有下图所示地图,每个区域代表一个省,区域中的数字代表省的编号,今将每个省涂上红(R),兰(B),黄(Y),绿(G)四种颜色之一,使相邻的省份有不同的颜色。

回顾算法-四色图着色

算法说明:

这是一道非常典型的回溯题目。解法与“八皇后问题”一样。在填写每一个省的颜色时检查与相邻已填省份的颜色是否相同。如果不同,则填上;如果相同(冲突),则另选一种;如果已没有颜色可供选择,则回溯到上一省份。重复这一过程,直到所有省的颜色都已填上。

最主要的问题在于如何解决相邻省的颜色冲突。对每一个省份,可供选择的颜色一共有四种;对省份i来说颜色x可填的条件是编号为1~(i-1)且与省i相邻的省份的颜色都不是x。

各省之间的相邻关系用矩阵R(n,n)来表示:

r(i,j)=1或0 1:表示相邻 0表示不相邻

本题的相邻矩阵如下:

0

1

0

0

0

0

1

1

0

1

1

1

1

1

0

1

0

1

0

0

0

1

1

1

0

1

0

0

0

1

0

1

0

1

0

0

1

0

0

1

0

1

1

1

0

0

0

1

0

主要函数:



经测试,此图共有192中着色方案, 示例如下:

回顾算法-四色图着色

回顾算法-四色图着色

回顾算法-四色图着色

测试程序:

http://download.csdn.net/detail/shuilan0066/4406160

读书人网 >其他相关

热点推荐