第一个做法是四色定理:
就类似于百度百科说的吧,一个地图,最少用四个颜色就可以表示全部的国家;这个题就可以假设四个点,然后开始涂颜色,
book数组来表示颜色i有没有被图,color数组表示i点涂色的编号。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct point
{
int next[27];
int n;
};
int main()
{
int n;
while(cin>>n)
{
int maxn=-1;
point p[27];
if(n==0)break;getchar();
for(int i=1;i<=n;i++)
{
getchar();getchar();
p[i].n=0;
char c;
while((c=getchar())!='\n')
{
int location=c-'A'+1;
++p[i].n;p[i].next[p[i].n]=location;
}
}
int color[27]={0};
for(int i=1;i<=n;++i)
{
color[i]=n+1;
bool book[27]={false};
for(int j=1;j<=p[i].n;++j)
{
int k=p[i].next[j];
if(color[k])
book[color[k]]=1;
}
for(int j=1;j<=n;j++)
{
if(!book[j]&&color[i]>j)
{
color[i]=j;
break;
}
}
if(maxn<color[i])
maxn=color[i];
}
if(maxn==1)cout<<"1 channel needed."<<endl;
else if(maxn>4)cout<<"4 channels needed."<<endl;
else cout<<maxn<<" channels needed."<<endl;
}
return 0;
}
暴力搜索:就是在dfs里面加一个搜索,循环的是颜色,是颜色,是颜色!!!!看懂四色原理很容易写出来,而且更贴合思路,应该还可以用四色原理剪纸一下就可以,比如在在DFS开头加上一个ans>4就让flag=true。。当然,每个卵用。。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int map[27][27],n;
int color[27];
bool flag;
int ans;
bool judge(int id,int c)
{
for(int i=1;i<=n;++i)
if(map[id][i]&&c==color[i])
return false;
return true;
}
void dfs(int id,int sum)
{
if(flag)return ;
if(id>n){flag=true;return;}
for(int i=1;i<=sum;++i)
{
if(judge(id,i))
{
color[id]=i;
dfs(id+1,sum);
color[id]=0;
}
}
if(!flag)
{
ans++;
dfs(id,sum+1);
}
}
int main()
{
while(cin>>n&&n!=0)
{
getchar();
memset(color,0,sizeof(color));
memset(map,0,sizeof(map));
for(int i=1;i<=n;++i)
{
char c;getchar();getchar();
while((c=getchar())!='\n')
{
int location=c-'A'+1;
map[i][location]=1;
}
}
int sum;
flag=false;
ans=1;
dfs(1,1);
if(ans==1)cout<<"1 channel needed."<<endl;
else cout<<ans<<" channels needed."<<endl;
}
return 0;
}