因为时间问题,没有详细描述算法思路。
#include "stdio.h"
//4种颜色着N个区域
//使用无向连通图表示区域,邻接矩阵存储图信息--因为偷懒,并没建立对应的数据结构
#define N 9
int adj[N][N]={{0,1,0,1,0,0,0,0,0},
{1,0,1,1,1,1,0,0,0},
{0,1,0,0,1,1,0,0,0},
{1,1,0,0,1,0,1,1,0},
{1,1,1,1,0,1,1,1,1},
{0,1,1,0,1,0,0,1,1},
{0,0,0,1,1,0,0,1,0},
{0,0,0,1,1,1,1,0,1},
{0,0,0,0,1,1,0,1,0}};
//打印一种着色方案
int printOneMethord(){
int color[]={1,2,3,4};
int a[N]={0,0,0,0,0,0,0,0,0};//记录9个区域颜色
int i,j,k=0,r;//k为已着色区域
while(k<9) {
r=0;//记录颜色值,从第一个颜色开始
a[k]=color[r];
for(j=0;j<9&&r<4;){
if(adj[k][j]&&a[j]){//如果是相邻区域,并且该区域已经着色
if(a[j]==a[k]){// 如果相邻区域颜色与当前此区域颜色相同
a[k]=color[++r];//换一种颜色
j=0;//从第一个相邻区域从新匹配
}else{
j++;//颜色不同,匹配下一个区域
}
}else{
j++;
}
}
if(r==4){
printf("着色失败!\n");
return 0;
}
k++;
}
for(i=0;i<9;i++){
printf("%4d",a[i]);
}
}
int check(int i,int j,int adj[][9],int a[]){
//判断在i点着j颜色是否ok,adj为图矩阵,a为区域着色的记录
for(int k=0;k<9;k++) {
if(adj[i][k]&&a[k]){
if(a[k]==j){
return 0;
}
}
}
return 1;
}
int a[9]={0,0,0,0,0,0,0,0,0};
/**
* 打印所有的着色方案
*/
void search(int adj[][9],int i){
if(i==9){
for(int j=0;j<9;j++){
printf("%4d",a[j]);
}
printf("\n");
}else{
for(int k=1;k<=4;k++){
if(check(i,k,adj,a)){
a[i]=k;
search(adj,i+1);
a[i]=0;//**************回溯**********************
}
}
}
}
int main(){
search(adj,0);
}