类Pascal三角的砖块压力计算及金字塔打印问题求助
砖块金字塔问题解决
一、修复金字塔打印代码
你原代码逻辑错误,无法正确输出金字塔结构。以下是可打印居中对齐金字塔的代码,每层标注砖块在当前层的位置编号:
# 打印10层居中对齐的砖块金字塔 total_layers = 10 for layer in range(1, total_layers + 1): # 前置空格实现居中效果 prefix_spaces = " " * (total_layers - layer) # 生成当前层的砖块位置标签 block_labels = [str(pos) for pos in range(1, layer + 1)] print(prefix_spaces + " ".join(block_labels))
运行后会输出层级分明的金字塔,每层数字代表砖块从左到右的位置(从1开始计数)。
二、实现上方压力计算函数
这个问题的压力传递规则和帕斯卡三角高度相关:每块砖会将自身重量(1)加上上方承受的压力,平均分配给下方相邻的两块砖(边缘砖仅分配给下方一块)。我们需要计算的是目标砖块上方所有砖块传递下来的总压力,提供两种实现方式:
方法1:递推法(直观易懂)
逐层计算每块砖的压力,适合层数较少的场景:
def calculate_pressure(target_layer, target_pos): # 参数说明:target_layer为目标砖块所在层数(从1开始),target_pos为砖块在层内的位置(从1开始) if target_layer == 1: return 0.0 # 顶部砖块无上方压力 # 初始化第一层的压力列表(仅1块砖,压力为0) prev_layer = [0.0] for layer in range(2, target_layer + 1): current_layer = [] for pos in range(1, layer + 1): if pos == 1: # 左侧边缘砖,仅接收上一层最左砖的总重量(自身重量+压力)的一半 pressure = (prev_layer[0] + 1) / 2 elif pos == layer: # 右侧边缘砖,仅接收上一层最右砖的总重量的一半 pressure = (prev_layer[-1] + 1) / 2 else: # 中间砖,接收上一层左右两块砖总重量的一半之和 pressure = (prev_layer[pos-2] + 1)/2 + (prev_layer[pos-1] + 1)/2 current_layer.append(pressure) prev_layer = current_layer return prev_layer[target_pos - 1]
方法2:组合数公式法(高效计算)
通过数学公式直接计算,无需逐层递推,适合层数较多的场景。
推导后的公式:对于第n层第i块砖(1≤i≤n),上方承受的压力为:
$$\text{pressure}(n,i) = \frac{(n-1) \times C(n-1, i-1) - (2^{n-1} - C(n-1, i-1))}{2^{n-1}}$$
其中$C(a,b)$为组合数(从a个元素中选b个的组合数)。
Python实现代码:
import math def calculate_pressure_formula(target_layer, target_pos): if target_layer == 1: return 0.0 n = target_layer i = target_pos comb = math.comb(n-1, i-1) numerator = (n-1)*comb - (2**(n-1) - comb) denominator = 2**(n-1) return numerator / denominator
验证示例
- 第2层第1块砖:
calculate_pressure(2,1)返回0.5,符合预期 - 第3层第2块砖:
calculate_pressure(3,2)返回1.0,与参考图一致 - 第4层第2块砖:
calculate_pressure(4,2)返回0.75,与参考图一致
内容的提问来源于stack exchange,提问作者user16574886
相关产品推荐
相关产品推荐

