题意 | 思路 |
---|
基本涂色问题:这里给出字母A~Z和每个字母相邻的字母,问最少需要需要多少要颜色才能满足 | 思路是:dfs,要注意的是每次dfs是做什么的,要有明确的目的才不会出错。 |
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int M = 30;
int isfind;
int color[M];
int gragh[M][M];
int ans;
int n;
int ok(int id,int x)
{
for(int i = 0;i < n; i++) {
if(gragh[id][i] && color[i] == x)
return false;
}
return true;
}
void dfs(int id,int num)
{
if(isfind) return ;
if(id == n) {
isfind = true;
return ;
}
for(int i = 1;i <= num; i++) {
if(ok(id,i)) {
color[id] = i;
dfs(id+1,num);
}
}
if(isfind == 0) {
ans++;
dfs(id,ans);
}
}
int main()
{
while(scanf("%d",&n) != EOF && n) {
memset(color,0,sizeof(color));
memset(gragh,0,sizeof(gragh));
for(int i = 0;i < n; i++) {
char s[1000];
scanf("%s",s);
int length = strlen(s);
for(int j = 2;j < length; j++) {
gragh[s[0]-'A'][s[j]-'A'] = true;
}
}
isfind = false;
ans = 1;
dfs(0,1);
if(ans == 1) {
printf("1 channel needed.\n");
}
else {
printf("%d channels needed.\n",ans);
}
}
return 0;
}