N個扇形M種顏色
阿新 • • 發佈:2018-03-16
nbsp 標記 range blog 使用 判斷 中間 div list
題:
將一個圓形等分成N個小扇形,將這些扇形標記為1,2,3,...,N,現在使用M種顏色對其塗色,要求相鄰兩個扇形顏色不相同。求:有多少種塗色方法?
備註:
1. 不考慮數值越界情況;
2. N >= 1, M >= 3;
3. 一個例子; 如果N=3, M=3時,一共有6種塗法
兩種方法:
①數學公式法
我所搜到的基本都是這種方法
②遞歸
自己寫的
分為三步:
1. 明確邊界
n個扇形,即長度為n的數組,當為第一個時,任意塗色,當為第n個時,停下,判斷
2. 判斷條件
當為第一個時,不需要判斷
當為2...n-1個時,與前一個不一樣
當為第n個時,與前一個不一樣 and 與第一個不一樣
1 def cal(n, m): 2 res = {} 3 res[n] = 0 4 def calsub(n, m, j): 5 if j == n-1: 6 for i in range(m): 7 if i != list_n[j-1] and i != list_n[0]: 8 res[n] += 1 9 return 10 else: 11 t = j #因為深度優先,所以j到後面會發生變化,因此用中間變量t保存當前扇形index12 for i in range(m): 13 if i != list_n[t-1]: 14 list_n[t] = i 15 j = t 16 j += 1 17 calsub(n,m,j) 18 19 if n == 1: 20 return m 21 list_n = list(range(n)) 22for i in range(m): 23 list_n[0] = i 24 calsub(n, m, 1) 25 return res[n]
N個扇形M種顏色