POJ - 1129题目链接
要想AC此题,必先要了解四色定理
我在写此题之前并不知道有那么个四色定理,上手就WA了五发,后来查了别人的题解,才知道这是一个四色填图,在此处我还是有个疑问,当有26个点时,并且每一个点都和其它的25个点相邻,这是的答案应该是多少,我的程序输出为0,但在POJ已AC此题
26
A:BCDEFGHIJKLMNOPQRSTUVWXYZ
B:ACDEFGHIJKLMNOPQRSTUVWXYZ
C:ABDEFGHIJKLMNOPQRSTUVWXYZ
D:ABCEFGHIJKLMNOPQRSTUVWXYZ
E:ABCDFGHIJKLMNOPQRSTUVWXYZ
F:ABCDEGHIJKLMNOPQRSTUVWXYZ
G:ABCDEFHIJKLMNOPQRSTUVWXYZ
H:ABCDEFGIJKLMNOPQRSTUVWXYZ
I:ABCDEFGHJKLMNOPQRSTUVWXYZ
J:ABCDEFGHIKLMNOPQRSTUVWXYZ
K:ABCDEFGHIJLMNOPQRSTUVWXYZ
L:ABCDEFGHIJKMNOPQRSTUVWXYZ
M:ABCDEFGHIJKLNOPQRSTUVWXYZ
N:ABCDEFGHIJKLMOPQRSTUVWXYZ
O:ABCDEFGHIJKLMNPQRSTUVWXYZ
P:ABCDEFGHIJKLMNOQRSTUVWXYZ
Q:ABCDEFGHIJKLMNOPRSTUVWXYZ
R:ABCDEFGHIJKLMNOPQSTUVWXYZ
S:ABCDEFGHIJKLMNOPQRTUVWXYZ
T:ABCDEFGHIJKLMNOPQRSUVWXYZ
U:ABCDEFGHIJKLMNOPQRSTVWXYZ
V:ABCDEFGHIJKLMNOPQRSTUWXYZ
W:ABCDEFGHIJKLMNOPQRSTUVXYZ
X:ABCDEFGHIJKLMNOPQRSTUVWYZ
Y:ABCDEFGHIJKLMNOPQRSTUVWXZ
Z:ABCDEFGHIJKLMNOPQRSTUVWXY
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
int n, b[30] = {0}, max_;
void dfs(int a[][30],int k){
if(max_ != 0) return ;
if(k == n){
set<int> Set;
for(int i=0;i<n;i++) Set.insert(b[i]);
max_ = Set.size();
return ;
}
int L = 1;
while(1){
b[k] = L ++;
if(b[k] == 5) break; //四色图填色只能是1~4这四种颜色,若出现第五种颜色,则返回上一层
int flag = 0;
for(int i=0;i<n;i++){
if(a[k][i] == 1 && b[k] == b[i]){
flag = 1; //判断该点与相邻点是否相同,相同为1
break;
}
}
if(flag == 0){ //若与相邻点都不同,进入下一个点进行填色
dfs(a,k+1);
}
}
}
int main(){
while(~scanf("%d",&n) && n){
getchar();
max_ = 0;
map <char,int> mp;
memset(b,0,sizeof(b));
char str[30][30] = {0};
int a[30][30] = {0}, L = 0, k = 0;
for(int i=0;i<n;i++) scanf("%s",str[i]);
for(int i=0;i<n;i++){
int len = strlen(str[i]);
for(int j=0;j<len;j++){
if(str[i][j] == ':') continue;
if(mp.find(str[i][j]) == mp.end()){
mp[str[i][j]] = L++;
}
if(j == 0) {
k = mp[str[i][j]];
continue;
}
a[k][mp[str[i][j]]] = 1;
}
}
dfs(a,0);
if(max_ == 1) printf("%d channel needed.\n",max_);
else printf("%d channels needed.\n",max_);
}
return 0;
}
/*
7
A:BCDEFG
B:ACDEFG
C:ABD
D:ABCE
E:ABDF
F:ABEG
G:ABF
4
*/