地图染色-四色定理

四色定理指出每个可以画出来的地图都可以至多用4种颜色来上色,而且没有两个相接的区域会是相同的颜色。被称为相接的两个区域是指他们共有一段边界,而不是一个点。

主要原理:从第一个区域开始染色,到每一个区域依次遍历相邻的区域,若未出现重色则将该色入栈,遍历下一个区域。若出现重色,进行换色直至四种颜色都出现重复,就回溯到上一个区域,更换颜色。

#include <iostream>
using namespace std;

#define NUM 100
//用图存储
typedef struct graph
{
    int edges[NUM][NUM];
    int v[NUM];
    int vnum, edgenum;
} Graph;

//首先用邻接矩阵作图 v[i][j]=1表示俩个国家相邻,v[i][j]=0表示不相邻
void Coloring(Graph G)
{
    int area = 1;     //代表当前染色数量 给第一个点染色 颜色为1 国家序号为0——NUM-1
    int nowcolor = 1; //当前颜色最大为4
    //第一个地方染色为1 如果当前区域染色不冲突则上色后将顶点入栈,否则出栈进行再次染色
    G.v[0] = 1;
    while (area < G.vnum)
    {
        while (nowcolor <= 4 && area < G.vnum)
        {
            int k = 1;
            //判断是否重色
            while (k < area && G.edges[area][k] * G.v[k] != nowcolor)
            {
                k++;
            }
            if (k == area)
            {
                //说明没有重复则
                G.v[area] = nowcolor;
                area++;
                nowcolor = 1;
            }
            else
            {
                nowcolor++;
            }
        }
        //回溯到上一个位置 换一个颜色继续染
        if (nowcolor > 4)
        {
            area--;
            nowcolor = G.v[area] + 1;
        }
    }
}

 

posted @ 2019-10-10 22:17  国-哥  阅读(3754)  评论(0编辑  收藏  举报