【题解】四色定理

题目描述

著名的四色定理你一定听说过吧?这可是近代世界三大数学难题之一呢(顺便提上一句,另外两个是费马定理和哥德马赫猜想)。
四色定理的提出来自英国。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;
}
原文地址:https://www.cnblogs.com/2021-yanghaoran/p/10790048.html