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]

 

转载于:https://www.cnblogs.com/bellumpara/p/8582830.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值