1. 程式人生 > >N個扇形M種顏色

N個扇形M種顏色

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保存當前扇形index
12 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)) 22
for i in range(m): 23 list_n[0] = i 24 calsub(n, m, 1) 25 return res[n]

N個扇形M種顏色