阿*里的实习在线评测题
要开始准备找工作了,做机器学习有两年的时间了,对一些基本的数据结构算法已经忘差不多了,此处主要记录一些找工作时遇到的算法,以战养战
题目描述:
将一个圆形划分为N个扇形,现有M中不同的颜色, 要求这N块相邻的区域不同色,问共有多少种不同的涂色方案(N>=1,M>=3)。
**举例说明:
当M=3,N=3时,输出的结果为6;M=5, N=5时,结果为1020。
分析:
这是个考查递归的问题,我们从N=1时想,这时明显有M种涂色方案,当N=2时,扇形1有M种,因为相邻不同色,故扇形2 有M-1种,所以S(2)=M(M-1)。沿着这个思路往下想,当N>=3时,会有M(M-1)^(N-1)种,如果这不是个圆形,那到此就结束了,但圆形需要考虑第N块与第1块相邻的问题,也就是说M(M-1)^(N-1)种涂色方案包含了第N块与第1块扇形同色的问题,(即N-1个扇形,M中颜色的涂色问题)所以S(N)=M(M-1)^(N-1)-S(N-1)
实现
#coding=utf-8
# 1. 当N=1,M种
# 2. 当N=2,M(M-1)
# 3. 当N>=3,M(M-1)^(N-1),但第N块与第1块可能会同色(即N-1的情况)
def Iter_func(N,M):
if N == 1:
S = M
elif N == 2:
S = M * (M - 1)
else:
S=M * ((M - 1)**(N-1))-Iter_func(N-1,M)
return S
M = int(input("M:"))
N = int(input("N:"))
S=Iter_func(N,M)
print(S)
链接:Github:https://github.com/xuerqiang/basic_algorithm/blob/master/sector_paint_ali.py