public class Coloring {
static int n; //圖的頂點(diǎn)數
static int m; //可用顏色數
static boolean[][] a; //圖的鄰接矩陣
static int[] x; //當前解
static long sum; //當前找到的可 m 著(zhù)色的方案數
/**
*
* @param matrix 地圖
* @param mm 顏色數
* @return 著(zhù)色方案數
*/
public static long mColoring(boolean[][] matrix, int mm) {
a = matrix;
n = a.length;
m = mm;
x = new int[n];
sum = 0;
trackback(0);
return sum;
}
private static void trackback(int t) {
if (t == n) {
sum++;
System.out.println(Arrays.toString(x));
} else {
for (int i = 0; i < m; i++) {
x[t] = i;
if (valid(t)) {
trackback(t + 1);
}
}
}
}
private static boolean valid(int t) {
//檢查顏色可用性
for (int i = 0; i < n; i++) {
if (a[t][i] && x[i] == x[t]) {
return false;
}
}
return true;
}
}