地图染色问题的实质就是用深搜去一一枚举,然后得到所有的染色方案。
下面这个例子就是用邻接矩阵实现的:
#include <iostream>
using namespace std;
int **a;//邻接矩阵
int *b;//每个方案的具体染色细节
int total = 0;//总的染色方案数量
int n;//地图中的国家数量
void readData();//读取数据
void dfs(int x);//深搜
void del();//释放内存
void readData()
{
cin >> n;
a = new int*[n + 1];
for(int i = 0 ; i < n + 1 ; i++)
{
a[i] = new int[n + 1];
}
b = new int[n + 1];
for(int i = 1; i < n + 1; i++)
{
for(int j = 1; j < n + 1; j++)
{
cin >> a[i][j];
}
}
}
void dfs(int t)
{
if(t > n) //染色方案+1
{
total++;
for(int i = 1; i <= n; i++)
{
cout << b[i] << " ";
}
cout << endl;
return;
}
for(int i = 1; i <= 4; i++)//四种颜色
{
bool xxx = true;
for(int j = 1; j < t; j++)
{
if(a[j][t] == 1 && b[j] == i)
xxx = false;
}
if(xxx == true)//可以染色
{
b[t] = i;
dfs(t + 1);//继续深搜
}
}
}
void del(){
delete[]b;
for(int i = 0 ; i < n + 1 ; i++){
delete[]a[i];
}
}
int main()
{
readData();
dfs(1);
del();
cout << total << endl;
return 0;
}