对两个"channel allocation”的总结

之前用两种方法解得这道题,但之前的那个解法是有错误的,那么二者之间的差异是什么?前一种方法(怎且叫它试探法):按照A-B-C-...依次判断每个节点的颜色,这样就会造成相邻节点的颜色以数值表示,一定是递增的,两种颜色不够用就用第三种颜色,三种不够就用第四种。这种遍历方法首先就不是一个完整的遍历。那什么是完整的遍历?想想回溯法解八皇后问题就知道了,就是回溯法。回溯法可以考虑每一种可能,可以理解为是一种枚举。

void dfs(int i, int n, int colour[], int Graph[30][30]) 

42 { 

43     if (i > n) 

44     { 

45         flag = true; 

46         return; 

47     } 

48     for (int c=1; c<=kind; c++) 

49     { 

50         colour[i] = c; 

51         if (Judge(i, n, colour, Graph)) 

52         { 

53             dfs(i+1, n, colour, Graph); 

54         } 

55     } 

56 } 

在第53行的地方是一个dfs的递归调用,通过这个递归实现了回溯。在main函数中,有这样一个循环:

for(kind=1; kind<=4; kind++)

68         { 

69             dfs(1, n, colour, Graph); 

70             if(flag) 

71             { 

72                 break; 

73             } 

74         } 

从1至4不断增加的kind是说:我先给你1种颜色,你用回溯法没居所有可能,看能不能解决,不能,kind增加1;若能,输出结果。不断地重复这个过程。

你可能感兴趣的:(location)