码题集 填矩阵

        有一个1xn的矩阵,现在往里面填方块,一共有三种方块:1×1的白块,1×1的黑块,1×k的黑块,方块放置时,必须是黑白交替的,矩阵不用填满,但要求最下面的块和最上面的块必须是黑色的,问有多少种放置方法。

         这道题我觉得大部分人的第一反应是采用递归的方法解决,我也是,代码如下:

# 设置函数用于递归,每次递归得到一种新的放置方法
def add_block(h):
    global n # 设置为全局变量
    global k
    global counts
    if h <= n: # 若高度小于等于h
        counts += 1 # 计数器加1
        add_block(h+1+1) # 继续递归,添加一个1x1白块和一个1x1黑块
        add_block(h+1+k) # 继续递归,添加一个1x1白块和一个1xk黑块

counts = 0 # 计数放置方法的总数
n, k = map(int, input().split()) # 输入数据

add_block(1) # 最底下为1x1黑块
add_block(k) # 最底下为1xk黑块

print(counts)

        看似没有问题,也确实代码是可以通过的,但是递归次数太多了,复杂度极高,很不推荐这种方法解决这道题。下面介绍利用排列的方法来做这道题,上代码。

# 阶层计算函数,同时也是全排列的计算函数
def factorial(n):
    if n<1:
        return 1
    res = 1
    for i in range(1, n+1):
        res *= i
    return res

n, k = map(int, input().split()) # 输入数据
sum = 0 # 计数放置方法的总数量
num1 = (n-1) // (1+1) # 除最低层外,最多放置1x1黑块的数量
num2 = (n-1) // (k+1) # 除最低层外,最多放置1xk黑块的数量
for i in range(num1+1):
    for j in range(num2+1):
        if 1+i*2+j*(1+k) <= n: # 当最底层可以是1x1黑块时,即高度小于等于n
            # 利用高中排列组合的知识,计算当1x1黑块为i个,1xk黑块为j个时,有多少种情况
            # 结果保存在临时变量count中
            count = factorial(i+j) // (factorial(i) * factorial(j))
            sum += count
        if k+i*2+j*(1+k) <= n: # 当最底层可以是1xk黑块时,即高度小于等于n
            sum += count

print(sum)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若风orz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值