地图着色问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
地图着色问题
说明:任何平面区域图都可以用四种颜色着色,使相邻区域颜色互异。这就是四色定理。
要求给定区域图排出全部可能的四着色方案。
区域相邻关系用矩阵表示,每个区域又一个序号,(从0七连续排列)adj【i】【j勘硎厩 騣,j相邻。数组cilir记录每个区域上着的色,用1.2.3.4表示。
程序应包括四个函数:
coloring对所给邻接矩阵找着全部着色方案
色乐的:对区域i在指定的颜色范围内选出可选颜色或报告失败(失败返回-1)
辞令次日卡:判断对区域i在指定的颜色c是否可用
八寸卡:选色失败时或完成一种着色方案时进行回溯
另外可定义output函数,每次输出一种着色方案
/*
递归算法:
void Coloring(区域 n)
1. 令颜色集ClrSet={ 没有被区域n的邻居区域使用的颜色 }.
2. 如果ClrSet是空集,返回.
3. 对ClrSet中的每种颜色c,作循环:
3.1 为区域n着色c。
3.2 如果所有区域都已着色(n是最后一个区域),那么显示/保存着色结果.
3.3 否则对下一个尚未着色的区域(n+1),调用Coloring(n+1).
4. 把区域n变为没有着色的区域.
--------------------------------------------------------
*/
template
class CColoring
{
private:
typedef int node_type;
typedef int color_type;
typedef std::set
typedef std::vector
public:
void operator()(const int _Matrix[node_count][node_count])
{
matrix = _Matrix;
colors_of_nodes.resize(node_count, 0); total_count = 0;
coloring(0);
}
private:
void coloring(node_type n)
{
// 颜色的使用情况
std::vector
node_type m;
color_type c;
// 初始化颜色的使用情况
used_colors.resize(color_count, false);
// 遍历每个与区域n相邻的区域m
for(m = 0; m < node_count; ++m)
{
if(matrix[n][m])
{
// 获取m的颜色
c = colors_of_nodes[m];
// m已着色
if(c != 0)
used_colors[c] = true;
}
}
// 遍历每个未被n的邻居使用的颜色c
for(c = 1; c < color_count; ++c)
{
if(!used_colors[c])
{
// 为n着色c
colors_of_nodes[n] = c;
// 着色完毕
if(n >= node_count - 1)
++total_count;
// 输出结果
_tprintf(_T("---------------------\n"));
_tprintf(_T("Method %d:\n"), total_count);
for(m = 0; m < node_count; ++m)
{
_tprintf(_T("node: %d, color: %d\n"), m, colors_of_nodes[m]); }
}
// 还有区域没有着色
else
{
// 为下一个未着色的区域,调用coloring()
coloring(n + 1);
}
}
}
// 将n设置为没有着色的区域
colors_of_nodes[n] = 0;
}
// 0表示无色,1-4表示4种不同颜色
static const int color_count = 5;
// 邻接矩阵
const int (* matrix)[node_count];
// 各区域对应的颜色
color_array colors_of_nodes;
// 总的着色方案数
int total_count;
};
void main()
{
int Matrix[4][4] =
{
{ 0, 1, 0, 0 },
{ 1, 0, 0, 0 },
{ 0, 0, 0, 1 },
{ 0, 0, 1, 0 },
};
CColoring<4> coloring;
coloring(Matrix);
}
/*
递归算法:
void Coloring(区域 n)
1. 令颜色集ClrSet={ 没有被区域n的邻居区域使用的颜色 }.
2. 如果ClrSet是空集,返回.
3. 对ClrSet中的每种颜色c,作循环:
3.1 为区域n着色c。
3.2 如果所有区域都已着色(n是最后一个区域),那么显示/保存着色结果.
3.3 否则对下一个尚未着色的区域(n+1),调用Coloring(n+1).
4. 把区域n变为没有着色的区域.
--------------------------------------------------------
*/
template
class CColoring
{
private:
typedef int node_type;
typedef int color_type;
typedef std::set
typedef std::vector
public:
void operator()(const int _Matrix[node_count][node_count])
{
matrix = _Matrix;
colors_of_nodes.resize(node_count, 0);
total_count = 0;
coloring(0);
}
private:
void coloring(node_type n)
{
// 颜色的使用情况
std::vector