欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

四色问题【DFS】

程序员文章站 2022-05-20 23:13:46
...

> Description

设有图4-11所示地图,每个区域代表一个省,区域中的数字代表省的编号,今将每个省涂上红®,兰(B),黄(Y),白(W)四种颜色之一,使相邻的省份不同颜色。
四色问题【DFS】
用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;
}