题目描述
著名的四色定理你一定听说过吧?这可是近代世界三大数学难题之一呢(顺便提上一句,另外两个是费马定理和哥德马赫猜想)。
四色定理的提出来自英国。1852年,毕业于伦敦大学的弗南西斯·格思里(Francis Guthrie)在一家科研单位搞地图着色工作时,发现了一种有趣的现象:“看来,每幅地图都可以用四种颜色着色,使得有共同边界的国家着上不同的颜色。”(注意:只要求有公共边的区域不同色就可以,只有公共顶点的同色也没关系)
这个结论能不能从数学上加以严格证明呢?他和在大学读书的弟弟格里斯决心试一试。兄弟二人为证明这一问题而使用的稿纸已经堆了一大叠,可是研究工作没有进展。
1852年10月23日,他的弟弟就这个问题的证明请教他的老师、著名数学家德·摩尔根,摩尔根也没有能找到解决这个问题的途径,于是写信向自己的好友、著名数学家哈密尔顿爵士请教。哈密尔顿接到摩尔根的信后,对四色问题进行论证。但直到1865年哈密尔顿逝世为止,问题也没有能够解决。
直到1976年,在J. Koch的算法的支持下,美国数学家阿佩尔(Kenneth Appel)与哈肯(Wolfgang Haken)在美国伊利诺斯大学的两台不同的电子计算机上,用了1200个小时,作了100亿判断,才终于完成了四色定理的证明。
你的任务相对那些数学家们来说当然要容易得多:你只要编写一个程序,计算一下在给定的一张有5个区域的地图上,用四种颜色填充不同区域,并保证有公共边的区域不同色的方案数有多少就可以了。
输入输出格式
输入格式:
第一行是一个整数N(0≤n≤10),分别表示地图中有公共边的区域的信息数量。
下面N行,每行一对整数,表示对所有区域编号之后,此两个编号的区域是有公共边的。
输出格式:
一行,只有一个整数,表示用四种颜色填充地图的总方案数。注意,在某些方案中,所有四种颜色不必都用到。
输入输出样例
输入样例:
4
1 2
1 3
1 4
1 5
输出样例:
324
这道题用搜索就可以解出来,首先求出它所有方案数,再判断我求出的方案是否符合条件
#include<iostream>
using namespace std;
int n,ans,color[15];
struct node
{
int x;
int y;
}pic[15];
void dfs(int pointer)
{
if(pointer>5)//判断
{
bool check=false;
for(register int i=1;i<=n;++i)
{
if(color[pic[i].x]==color[pic[i].y])
{
check=true;
break;
}
}
if(check==false) ++ans;
return;
}
else//枚举方案
{
for(register int i=1;i<=4;++i)
{
color[pointer]=i;
dfs(pointer+1);
}
}
}
int main()
{
cin>>n;
for(register int i=1;i<=n;++i)
{
cin>>pic[i].x>>pic[i].y;
}
dfs(1);
cout<<ans;
}