如何修改Python矩阵填充代码实现指定块填充?验证逻辑正确性
矩阵方块填充问题的代码修正与逻辑验证
问题背景
给定一个n*m的全0矩阵,要求使用指定大小的方块填充空白区域,方块需保持完整形状、不与已有内容重叠。例如放入2*2的方块后,矩阵应变为:
[[1,1,0,0], [1,1,0,0], [0,0,0,0], [0,0,0,0]]
若矩阵无可用空间容纳方块,返回-1。
现有代码问题
现有代码按行优先顺序逐个填充方块元素,导致方块形状被破坏:
- 当前输出:
[[1, 1, 1], [1, 0, 0], [0, 0, 0], [0, 0, 0]] - 预期输出:
[[1, 1, 0], [1, 1, 0], [0, 0, 0], [0, 0, 0]]
原代码的核心问题是没有保持方块的二维结构,只是将方块元素按一维队列顺序填充矩阵的空白位置,无法满足"完整方块填充"的要求。
代码修正方案
修改后的函数需要先找到矩阵中能完整容纳方块的空白区域,再按方块的二维结构填充:
def solution(matrix, block): m = len(matrix) n = len(matrix[0]) if m > 0 else 0 bm = len(block) bn = len(block[0]) if bm > 0 else 0 # 先判断方块尺寸是否超出矩阵范围 if bm > m or bn > n: return -1 # 遍历所有可能的方块左上角起点 for start_row in range(m - bm + 1): for start_col in range(n - bn + 1): # 检查目标区域是否全为空白 is_valid = True for r in range(bm): for c in range(bn): if matrix[start_row + r][start_col + c] != 0: is_valid = False break if not is_valid: break if is_valid: # 按方块形状填充目标区域 for r in range(bm): for c in range(bn): matrix[start_row + r][start_col + c] = block[r][c] return matrix # 无可用空间容纳方块 return -1
修正逻辑说明
- 先校验方块尺寸是否超过矩阵,若超出直接返回
-1 - 遍历矩阵中所有可能的方块左上角坐标(确保方块不会超出矩阵边界)
- 检查每个候选区域是否全为空白,找到第一个有效区域后,按方块的二维结构填充对应位置
- 若遍历完所有位置都没有有效区域,返回
-1
给定填充逻辑的正确性判断
用户提供的这段填充逻辑完全错误,问题如下:
for i,row in enumerate(block): for j,val in enumerate(row): while i<m and j<n: if matrix[i][j] == 0: if d: matrix[i][j] = d.popleft() else: break i += 1 j += 1
- 外层循环的
i、j是方块的索引,修改i +=1、j +=1会破坏外层循环的遍历逻辑 while循环内部没有递增i或j,只会执行一次,逻辑无意义- 填充位置是
(i,j)、(i+1,j+1)等对角线位置,完全无法保持方块的矩形形状 - 没有检查目标区域是否能完整容纳方块,无法保证填充的连续性和正确性
内容的提问来源于stack exchange,提问作者meallhour
相关产品推荐
相关产品推荐

