问题描述
四色猜想:“任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色。”——弗南西斯·格思里
有形如下列图形的地图,图中每一块区域代表一个国家,现请你用红(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++;
}