描述
四色问题的内容是:“任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色”。用数学语言表示,即“将平面任意地细分为不相重迭的区域,每一个区域总可以用1,2,3,4这四个数字之一来标记,而不会使相邻的两个区域得到相同的数字。”本程序对给定的区域图找出所有可能的不超过四种颜色的着色方案。简单起见,10个区域。且只要求输出着色方案数即可。
输入
一个10*10的矩阵A,若A[i][j]为1,则表示i区域和j区域相邻。为0表示不相邻。
输出
着色方案数。
输入样例
0 1 0 1 1 1 1 1 1 1
1 0 1 1 0 1 1 1 1 0
0 1 0 1 0 1 1 0 1 1
1 1 1 0 1 1 0 0 1 1
1 0 0 1 0 1 0 0 0 0
1 1 1 1 1 0 1 0 0 1
1 1 1 0 0 1 0 0 1 0
1 1 0 0 0 0 0 0 1 1
1 1 1 1 0 0 1 1 0 1
1 0 1 1 0 1 0 1 1 0
1 0 1 1 0 1 1 1 1 0
0 1 0 1 0 1 1 0 1 1
1 1 1 0 1 1 0 0 1 1
1 0 0 1 0 1 0 0 0 0
1 1 1 1 1 0 1 0 0 1
1 1 1 0 0 1 0 0 1 0
1 1 0 0 0 0 0 0 1 1
1 1 1 1 0 0 1 1 0 1
1 0 1 1 0 1 0 1 1 0
输出样例
24
#include <iostream>
#define M 4
#define n 10
using namespace std;
int a[n][n];
int x[1000];
int ans;
bool legal(int k)
{
for(int i = 0 ;i < n; i++)
{
if(a[k][i] && x[i] == x[k])
return false;
}
return true;
}
void dfs(int k)
{
if(k == n)
{
ans++;
return;
}
for(int i = 1; i <= M; i++)
{
x[k] = i;
if(legal(k))
dfs(k+1);
}
x[k] = 0; //回溯关键
}
int main()
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
cin >> a[i][j];
}
}
dfs(0);
cout << ans << endl;
}