使用至多4种颜色给多区域着色问题

来源:互联网 发布:java数据字典怎么写 编辑:程序博客网 时间:2024/06/14 19:51

因为时间问题,没有详细描述算法思路。

#include "stdio.h"//4种颜色着N个区域//使用无向连通图表示区域,邻接矩阵存储图信息--因为偷懒,并没建立对应的数据结构 #define N 9int 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);}



原创粉丝点击