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

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

#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);
}



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值