public class ColoringProblem { private enum Color { RED, GREEN, WHITE } static boolean[][] graph = {{false, true, false, true, false, false}, {true, false, true, false, true, false}, {false, true, false, false, false, true}, {true, false, false, false, true, false}, {false, true, false, true, false, true}, {false, false, true, false, true ,false}}; static Color[] graphColor = new Color[graph.length]; static int countComb = 0; public static void main(String[] args) { paintColor(0); System.out.println("總共有" + countComb + "種塗色方法"); } private static void paintColor(int vertex) { if (vertex < graph.length) { for (Color c: Color.values()) { boolean isUsed = false; for (int i=0; i<graph.length; i++) { if (graph[vertex][i] && graphColor[i] == c) { isUsed = true; break; } } if (!isUsed) { graphColor[vertex] = c; paintColor(vertex + 1); graphColor[vertex] = null; } } } else { for (int i=0; i<graphColor.length; i++) System.out.printf("%-6s", "v" + (i + 1)); System.out.println(); for (Color c: graphColor) { switch (c) { case RED: System.out.printf("%-6s", "red"); break; case GREEN: System.out.printf("%-6s", "green"); break; case WHITE: System.out.printf("%-6s", "white"); } } System.out.print("\n\n"); countComb++; } } }
範例輸入輸出:
此程式解決的是塗色問題,也就是在一個graph上面,用m個顏色去著色,並且相鄰的點不可以塗上相同的顏色。程式的作法是先選一個點並且從第一個顏色開始嘗試,塗上顏色後在選擇下一個點塗色。塗色時需要檢查相鄰的點有沒有使用一樣的顏色,若有使用一樣的顏色,就必須換色,若沒有顏色可以塗,就必須更改上一個點的顏色。若所有點都成功上色了,就表示找到一個塗色方法了,依照這個方法不斷做下去,就可以找出所有塗色的方法了。
因為此程式是解決課本第5章第18題的問題,所以輸入參數已經寫死在程式裡,輸出為所有的塗色方法和塗色方法的總數目。因為輸出結果過長,所以以上只貼出部份輸出結果。
沒有留言:
張貼留言