四色问题【DFS】

> Description

设有图4-11所示地图,每个区域代表一个省,区域中的数字代表省的编号,今将每个省涂上红®,兰(B),黄(Y),白(W)四种颜色之一,使相邻的省份不同颜色。
四色问题【DFS】_第1张图片
用1表示R,2表示B,3表示Y,4表示W,本题中第一块区域必须涂R,第一块区域颜色规定填涂1。

> Input
第一行输入n。
第2n+1行:每行表示1n个省,相邻的省用1表示(本身不与本身相邻)。

> output
输出每种可以填色的方式和总数。

> Sample Input
7
0 1 0 0 0 0 1
1 0 1 1 1 1 1
0 1 0 1 0 0 0
0 1 1 0 1 0 0
0 1 0 1 0 1 0
0 1 0 0 1 0 1
1 1 0 0 0 1 0

> Sample Output
1 2 1 3 1 3 4 (这是其中的一种,并按字典顺序输出)
…….
96 总数

> 解题过程
用深搜解题。
省市1必须填色1,所以从省市2开始枚举填四个颜色,如果与相邻的省市填了相同的颜色,继续枚举,否则直接枚举省市3……

> 代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,s[101][101],a[101],len=0;

void input()
{
	scanf("%d",&n);
	memset(a,0,sizeof(a));
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=n;j++)
      scanf("%d",&s[i][j]);
}

bool ooo(int x,int c)//判断当前的颜色是否与相邻的冲突
{
	for(int j=1;j<=x-1;j++)//判断已输入过的省市
	 if(s[x][j]==1)
	  if(c==a[j]) return false;
	return true;
}

void lil(int dep)
{
	if(dep>n)//当深度超过n就输出
	{
	    for(int i=1;i<=n;i++)
	     printf("%d ",a[i]);
	    printf("\n");
	    len++; return;//累加总数
	}
	for(int i=1;i<=4;i++)
    {
		a[dep]=i;
		if(ooo(dep,i)) lil(dep+1);
		//如果不冲突继续枚举
		a[dep]=0;
	}
}

int main()
{
	input();
	a[1]=1;
	lil(2);
	printf("%d",len);
	return 0;
}

你可能感兴趣的:(四色问题【DFS】)