搜索题
四色问题 ,第一个程序没有用到dfs,对于四个色进行遍历,对于每一个节点,从1到4色进行遍历,然后遍历与每个点相邻的点,如果有相邻的点有
相同的色,那么退出循环,并且换下一个色进行循环
qwertyxk | 1129 | Accepted | 168K | 0MS | C++ | 970B | 2012-12-24 20:02:16 |
#include<stdio.h>
#include<string.h>
int graph[30][30],color[30];
int main()
{
int n;
while(scanf("%d",&n))
{
if(n==0)
break;
int i,j;
for(i=1;i<=n;i++)
color[i]=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
graph[i][j]=0;
for(i=0;i<n;i++)
{
char str[50];
scanf("%s",str);
int len=strlen(str);
for(j=0;j<len;j++)
{
if(j==0||j==1)
continue;
graph[str[0]-'A'+1][str[j]-'A'+1]=1;
}
}
for(i=1;i<=n;i++) //算法的核心代码,对点进行遍历
{
for(color[i]=1;color[i]<=4;color[i]++) //对每个点进行四个色的遍历
{
bool in=false;
for(j=1;j<=n;j++)
{
if(j==i)
continue;
if(graph[i][j]==1&&color[j]==color[i])
{
in=true;
break;
}
}
if(j==n+1&&!in)
break;
}
}
int max=0;
for(i=1;i<=n;i++)
if(color[i]>max)
max=color[i];
if(max==1)
printf("%d channel needed.\n", max);
else
printf("%d channels needed.\n",max);
}
return 0;
}
qwertyxk | 1129 | Accepted | 164K | 0MS | C++ | 932B | 2012-12-24 20:28:02 |
这个是用dfs做出来的,代码供参考
#include<stdio.h>
#include<memory.h>
bool g[26][26];
int used[26],n;
bool dfs(int id,int color)
{
int i,j;
bool flag;
for(i=0;i<color;i++)
{
flag=true;
used[id]=i;
for(j=0;j<id;j++)
{
if(g[id][j]&&used[id]==used[j])
{
flag=false;
break;
}
}
if(flag&&(id==n-1||dfs(id+1,color)))
return true;
}
return false;
}
int main()
{
int i,j;
bool one;
char adjacent[50];
while(scanf("%d",&n)&&n)
{
memset(g,0,sizeof(g));
memset(used,0,sizeof(used));
one=true;
for(i=0;i<n;i++)
{
scanf("%s",adjacent);
for(j=2;adjacent[j];j++,one=false)
{
g[i][adjacent[j]-'A']=true;
g[adjacent[j]-'A'][i]=true;
}
}
if(one)
printf("1 channel needed.\n");
else if(dfs(1,2))
printf("2 channels needed.\n");
else if(dfs(1,3))
printf("3 channels needed.\n");
else
printf("4 channels needed.\n");
}
return 0;
}