算法: 有两个小球,黑白,分别用1 0表示,传入一个数字n表示有n个小球,请打印出所有可能的排列,附加条件:不能连续出现三个颜色相同的小球。
问题需要通过满足附加条件分析出子问题,通过动态规划求出问题的解。不能连续出现三个颜色相同的小球,需要判断相邻的三个小球是否是同一颜色,所以问题需要根据小球的颜色进行分解。
假设BB(n)是开始为两个黑球,并且没有出现三个颜色相同小球的所有排列。
BW(n)是开始为黑球、白球,并且没有出现三个颜色相同小球的所有排列。
WB(n)是开始为白球、黑球,并且没有出现三个颜色相同小球的所有排列。
WW(n)是开始为白球、白球,并且没有出现三个颜色相同小球的所有排列。
上述问题的解就是BB(n),BW(n),WB(n),WW(n)的组合。上面四个公式可以通过下面的公式推导得到:
- BB(n) = B + BW(n-1)
- BW(n) = B + WB(n-1) or B + WW(n-1)
- WB(n) = W +BB(n-1) or W + BW(n-1)
- WW(n) = W + WB(n)
注意BB(n),WW(n)的推导公式需要满足不能出现三个颜色相同的情况。
当n=2,我们就有:
- BB(2) = ‘BB’
- BW(2) = ‘BW’
- WB(2) = ‘WB’
- WW(2) = ‘WW’
python代码如下:
def BB(n, dig):
if n == 2:
dig = dig + 'BB'
print(dig)
return
dig = dig + 'B'
BW(n-1, dig[:])
def BW(n, dig):
if n == 2:
dig = dig + 'BW'
print(dig)
return
dig = dig + 'B'
WB(n-1, dig[:])
WW(n-1, dig[:])
def WB(n, dig):
if n == 2:
dig = dig + 'WB'
print(dig)
return
dig = dig + 'W'
BB(n-1, dig[:])
BW(n-1, dig[:])
def WW(n, dig):
if n == 2:
dig = dig + 'WW'
print(dig)
return
dig = dig + 'W'
WB(n-1, dig[:])
def shuffle(n):
dig = ''
BB(n, dig[:])
BW(n, dig[:])
WB(n, dig[:])
WW(n, dig[:])