四色问题
【题目描述】
给定一张包含N(N <= 8)个点的地图,以及地图上各点的相邻关系(0代表不相邻,1代表相邻),询问用4种颜色将地图涂色的所有方案数(要求相邻两点不能涂成相同的颜色)。
【输入描述】
第一行输入一个整数N,表示地图上有N个点;
接下来N行,每行输入N个整数,每个整数为0或1,第i行、第j列的值代表了第i个点和第j个点是否相邻。
【输出描述】
输出一个数,表示染色的所有方案数。
【样例输入】
8
0 0 0 1 0 0 1 0
0 0 0 0 0 1 0 1
0 0 0 0 0 0 1 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
1 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0
【样例输出】
15552
深度优先搜索+回溯:
源代码: #include<cstdio> int n,ans(0),i[9]; bool f[9][9]; void DFS(int t) { for (int a=1;a<=4;a++) //似乎是一种染色问题的模板。 { bool Flag(0); for (int b=1;b<=n;b++) if (f[t][b]&&i[b]==a) { Flag=true; break; } if (!Flag) if (t==n) ans++; else { i[t]=a; DFS(t+1); i[t]=0; } } } int main() //朴素DFS。 { scanf("%d",&n); for (int a=1;a<=n;a++) for (int b=1;b<=n;b++) scanf("%d",&f[a][b]); DFS(1); printf("%d",ans); return 0; }
非回溯解法:
源代码: #include<cstdio> int n,ans(0),i[9]; bool f[9][9]; void DFS(int t) { for (i[t]=1;i[t]<=4;i[t]++) //值得借鉴。 { bool Flag(0); for (int a=1;a<=n;a++) if (f[t][a]&&i[t]==i[a]) { Flag=true; break; } if (!Flag) if (t==n) ans++; else DFS(t+1); } } int main() { scanf("%d",&n); for (int a=1;a<=n;a++) for (int b=1;b<=n;b++) scanf("%d",&f[a][b]); DFS(1); printf("%d",ans); return 0; }