原题

小蓝有黄绿蓝三种颜色的小球,分别为 R、G、B 个。同样颜色的小球没有区别。小蓝将这些小球从左到右排成一排,排完后,将最左边的连续同色小球个数记为 蓝桥杯备战日志(Python)21-排列小球-(递归搜索)_搜索求解,将接下来的连续小球个数记为 蓝桥杯备战日志(Python)21-排列小球-(递归搜索)_递归_02,以此类推直到最右边的小球。

请问,总共有多少总摆放小球的方案,使得 蓝桥杯备战日志(Python)21-排列小球-(递归搜索)_递归_03 为严格单调递增序列,即 t1 < t2 < t3 < ... 。

输入描述

输入一行包含三个整数 蓝桥杯备战日志(Python)21-排列小球-(递归搜索)_搜索_04。其中,蓝桥杯备战日志(Python)21-排列小球-(递归搜索)_搜索求解_05

输出描述

输出一个整数,表示答案。

蓝桥杯备战日志(Python)21-排列小球-(递归搜索)_搜索求解_06


分析

首先是“存放”小球,使用一个列表r_g_b存储三种小球的数目列表的索引i (i=0,1,2)可以代表小球的颜色。本题基于搜索求解,因为每个位置放置小球可能有不同的情况,使用递归会更方便。具体实现见“源码”部分的代码和注释,方法put_ball(color: int,t: int)是解题关键,其基本思路如下:

  • 设当前已经连续放置相同颜色小球的数量为t,小球颜色为color,则继续放置小球有两种情况:
  • ①继续放一个相同颜色小球,放置后color的值不变,t=t+1,对应颜色小球的数量-1;
  • ②放置不同颜色的小球(根据题意,该种颜色小球的数量需要大于t),需要放置t+1个,放置后color的值改变,t=t+1,对应颜色小球的数量-(t+1);
  • 递归搜索,继续放置小球,直至各种颜色的小球均被用完则找到一种
  • 回溯,继续搜索其它不同的小球摆放方案


源码

r_g_b = list( map(int, input().split()) )

count = 0

# 从左到右放置小球
# color:上一个球的颜色(0,1,2);t:当前连续放置相同小球的数量
def put_ball(color: int,t: int):
global count
# 所有颜色球都用完
if sum(r_g_b) == 0:
count += 1
return

for i in range(3):
# 继续放相同颜色小球
if i == color and r_g_b[i] >= 1:
r_g_b[i] -= 1
put_ball(i, t+1)
r_g_b[i] += 1
# 放不同颜色小球,至少要连续放t+1个(因为要比上一种颜色小球多才满足题意)
elif r_g_b[i] > t:
r_g_b[i] -= t+1
put_ball(i, t+1)
r_g_b[i] += t+1

# 放第一个小球,最多3种方案
for i in range(3):
if r_g_b[i] > 0:
r_g_b[i] -= 1
put_ball(i,1)
r_g_b[c] += 1 # 回溯

print(count)


上一篇:​​蓝桥杯备战日志(Python)20-受伤的皇后-(矩阵搜索、递归)​