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种方案(图中红框框处的)进行验证: