这题可以划归成四色原理的题目,着色问题其实就是一个简单的暴力深搜,化成0-1矩阵是我觉得比较好的方法。
代码如下
#include<stdio.h>
#include<string.h>
#define M 26
int n,ans,color[M];
int map[M][M],isFind;
int ok(int x,int c)
{
int i;
for(i=0;i<n;i++)
if(map[x][i]&&c==color[i])
return 0;
return 1;
}
void DFS(int id,int total)
{
int i;
if(isFind)
return;
if(id>=n)
{
isFind=1;
return;
}
for(i=1;i<=total;i++)
{
if(ok(id,i))
{
color[id]=i;
DFS(id+1,total);
color[id]=0;
}
}
if(!isFind)
{
ans++;
DFS(id,total+1);
}
}
void main()
{
int i,j;
char s[M];
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
getchar();
memset(map,0,sizeof(map));
memset(color,0,sizeof(color));
for(i=0;i<n;i++)
{
gets(s);
for(j=2;s[j]!='\0';j++)
map[s[0]-'A'][s[j]-'A']=1;
}
isFind=0;
ans=1;
DFS(0,1);
if(ans==1)
printf("1 channel needed.\n");
else
printf("%d channels needed.\n",ans);
}
}