N个扇形M种颜色

题:

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

 

posted @ 2018-03-16 15:55  bellum  阅读(616)  评论(0编辑  收藏  举报