题目大意:给定几个转发器,这些转发器有相邻的转发器,相邻的转发器不能有相同的频道,转化为涂色问题。四色问题:任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色。所以说最多使用四种颜色。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int map[26][26];
//用来存储每个节点的颜色,节点的颜色从1开始编号
//若有两种颜色则颜色为1,2.
int used[30];
int n;
char ch[30];
//写的非常好,需要学习
//每次先将要涂色的点图上一个颜色然后再和周边的已经涂色的邻居比较
//若颜色相同,则该颜色不满足需求需要换一种颜色。
bool dfs(int node,int kind)
{
int i,j;
bool flag;
//每次都是从1开始选择点,这避免了回溯(我的理解)
for(i=1;i<=kind;i++)
{
flag=true;
used[node]=i;
//每次加入一个节点,和之前加入的节点的颜色进行比较,按0~(n-1)的顺序加入
for(j=0;j<node;j++)
{
if(map[node][j]!=0&&used[j]==i)
{
flag=false;
break;
}
}
if(flag&&(node==n-1||dfs(node+1,kind)))
return true;
}
return false;
}
int main()
{
int i,j;
bool one;
while(scanf("%d",&n)&&n)
{
one=true;
memset(map,0,sizeof(map));
memset(used,0,sizeof(used));
//读入数据,对图进行处理
for(i=0;i<n;i++)
{
scanf("%s",ch);
for(j=2;j<strlen(ch);j++,one=false)
{
map[i][ch[j]-'A']=1;
map[ch[j]-'A'][i]=1;
}
}
//============================
if(one)
printf("1 channel needed.\n");
else if(dfs(0,2))
printf("2 channels needed.\n");
else if(dfs(0,3))
printf("3 channels needed.\n");
else
printf("4 channels needed.\n");
}
return 0;
}
比如说这张图吧,若我们只能选择三种颜色的话,我们可以将A涂色为1,然后将B涂色为2,再将D涂色为3,C这是将没有颜涂色色可选。而如果我们将A涂色为1,B涂色为2,D涂色为1的话,那么C将可以选择3.所以本题代码的写法总是从头开始遍历,选择那些用过的颜色。个人理解。