【NKOJ-2165】【搜索】四色问题

问题描述

四色猜想:“任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色。”——弗南西斯·格思里
有形如下列图形的地图,图中每一块区域代表一个国家,现请你用红(1)、兰(2)、黄(3)、绿(4)四种颜色给这些国家填上颜色,要求每一国家用一种颜色,且任意两个相邻国家的颜色不能相同,请给出一种符合条件的填色方案。给出国家的数量(<=20)和它们的邻接关系。找出可行的方案总数,按第1个国家到第n个国家输出方案,只输出其中字典序最小的一种。

输入格式

第一行,一个整数n,表示总的国家数(n<=20)
接下来一个n*n的矩阵,用空格间隔的0和1表示国家间的相邻关系,如果第i行第j列是1,表明第i个国家与第j个国家相邻

输出格式

第一行,一种字典序最小的方案
第二行,一个整数,表示总的方案数

样例输入

7
0 1 0 0 0 0 1
1 0 1 1 1 1 1
0 1 0 1 0 0 0
0 1 1 0 1 0 0
0 1 0 1 0 1 0
0 1 0 0 1 0 1
1 1 0 0 0 1 0

样例输出

1213134
384

#include<iostream>
using namespace std;
bool map[51][51]; 
int color[51],n,t,sum=0,f=-1;
void s(int);
int main(){
	cin>>n; 
	for(int i=1;i<=n;i++) {
		for (int j=1;j<=n;j++) {
			cin>>t;
			if(t==1)map[i][j]=true; else map[i][j]=false;
		}
	}
	s(1);
	cout<<endl<<sum;
	return 0;
}
void s(int x) {
	bool flag;
	if(x>n) {
		sum++;
		if(sum==1) {
			for (int i = 1; i <= n; i++) {
				cout << color[i];
			}
		}
		return;
	}
	for (int i=1;i<=4;i++) {
		flag=true;
		for (int k=1;k<x;k++) {
			if(map[x][k]&&color[k]==i){
				flag=false;
				break;
			}
		}
		if (flag==true){
			color[x]=i;
			s(x+1);
		}
	}
	f++;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huangyucheng123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值