图的四色着色(C语言)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21149391/article/details/79507153

2017计算机学硕复试真题

用四种颜色给地图着色,要求相邻块颜色不同,图用邻接矩阵存储,求所有着色方案。

思路:

(草稿)

递归,如用下图,做出邻接矩阵:

map[N][N] = {   0,1,1,0,1,
1,0,1,0,1,
1,1,0,1,0,
0,0,1,0,1,

1,1,0,1,0  }

inputColor(int n,int *color,int col,int sign)是一个递归函数,其中

n表示给第n个点着色 ,col=1表示已经着色,col=0表示未着色 ,sign=0表示未验证,sign=1表示已验证且可行

有以下三种情况:col    sign
   0       0//未着色 ,则着色
   1       0//已着色但未验证 

   1       1//着色且此色可用

故在函数中分三种情况判断:

1、if(col == 0)  //未着色

那么将每一种颜色(颜色用1,2,3,4表示)赋给color[n],并调用递归inputColor(n,color,1,0) 去验证着此色是否可行 

2、if(col==1 && sign==0) //已着色但未验证 

那么验证此位用此色是否行得通,验证方法:在邻接矩阵中找到与此点相邻的点,若这些点的颜色不相邻,则

inputColor(n,color,1,1)//此色可用,sign置为1,若此色不可行,则不作处理,也就不会再有任何操作,也无法打印

3、if(col==1 && sign==1) //着色且此色可用

那么,判断一下此时的n是否是最后一位,若是最后一位即n==N-1,则表示所有位都成功赋予一个颜色,故打印输出

若n<N-1,则去进行处理下一位,inputColor(n+1,color,0,0),当然,下一位的col和sign都是0,回到第一种情况继续处理这一位。

=========================================================================

故如此递归,可以找出所有的着色方案。

代码如下:

#include<stdio.h>
#define N 5
int map[N][N] = {0,1,1,0,1,
    1,0,1,0,1,
    1,1,0,1,0,
    0,0,1,0,1,
    1,1,0,1,0};//五个点,七条边的图,邻接矩阵表示
int main(){
    void inputColor(int n,int *color,int col,int sign);
    int color[5]={0};
    inputColor(0,color,0,0);
    return 0;
}
/**给第n个点着色 ,col=1表示已经着色,col=0表示未着色 ,sign=0表示未验证,sign=1表示已验证且可行 **/
/*
 有以下三种情况:col    sign
 0       0//未着色 ,则着色
 1       0//已着色但未验证
 1       1//着色且此色可用
 当n=N-1,即最后一位时,若此时col==1,sign==1,则可打印输出
 */
void inputColor(int n,int *color,int col,int sign){
    int i;
    if(col == 0){//未着色 ,则着色
        for(i=1;i<=4;i++){//颜色1-4
            color[n] = i;
            inputColor(n,color,1,0);//验证着此色是否可行
            
        }
    }
    else if(col==1 && sign==0){//已着色但未验证 ,则验证此位
        for(i=0;i<N;i++)
            if(map[n][i]==1 && color[n]==color[i])
                return;ç
        inputColor(n,color,1,1);//此色可用,sign置为1
    }
    else if(col==1 && sign==1){//着色且此色可用
        if(n<N-1)//进行下一位
            inputColor(n+1,color,0,0);
        else if(n==N-1){//若此位是最后一位,则打印输出
            for(i=0;i<N;i++)
                printf("%d\t",color[i]);
            printf("\n");
        }
    }
    
}

运行结果:


随机挑选4种方案(图中红框框处的)进行验证:



猜你喜欢

转载自blog.csdn.net/qq_21149391/article/details/79507153