排列小球蓝桥杯真题python解法

题目描述

 解题思路

深度遍历探索所有的可能性先从第一个颜色在第一个只有一个颜色开始。。依次寻找。具体看代码注释。对于依次递增就只好判断每次换色后是否比前一个颜色多,依次类推。

代码

    def dfs(n,t,c):
        '''
        :param n:表示小球总数
        :param t:表示上个统计的球数
        :param c:表示上个统计的颜色
        :return:
        '''
        global s#全局化方法数
        #如果小球被排列完,则返回方法数
        if n==0:
            s+=1
            return
        else:
            #i记录下一个小球的颜色,换另一种颜色排列
            for i in range(3):
                #颜色相同或剩余球数不够,不足以满足严格单调递增,继续换色
                if i==c or l[i]<t+1:
                    continue
                #与上次排列颜色不同且剩余球数足够继续排列
                else:
                    #j记录下一组连续同色小球的个数,至少比上一组(t个)多一个,至多剩余的全部放上
                    for j in range(t+1,l[i]+1):
                        #剩余i色小球数量
                        l[i]-=j
                        #继续排列,总共剩余n-j个小球,本次有连续同色小球为j个,颜色为i
                        dfs(n-j,j,i)
                        #不妨将此中的j记为j1
                        #上面的dfs只是一种排列可能
                        #排列完后还要看是否有j2,j3
                        #j寻找完后换色继续
                        l[i]+=j







    #s统计方法数
    s=0
    #l[0]表示R的个数,l[1]表示G的个数,l[2]表示B的个数
    l=[int(i) for i in input().split()]
    #小球总个数
    n=sum(l)

    dfs(n,0,-1)
    print(s)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值