题:
将一个圆形等分成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]