如何不使用Numpy生成指定规格的棋盘格二维数组?
原生Python实现棋盘格生成函数
chequerboard 问题描述
需要实现一个原生Python函数chequerboard(n, m, offset_h, offset_w),所有参数均≥1,返回一个n行m列的二维数组,满足以下规则:
- 每个棋盘区块大小为
offset_h行 ×offset_w列 - 左上角单元格始终为填充状态(
'#') - 仅右侧和底部边缘允许存在不完整的棋盘区块
示例输出:
# 示例1:chequerboard(6, 8, 2, 2) [['#', '#', ' ', ' ', '#', '#', ' ', ' '], ['#', '#', ' ', ' ', '#', '#', ' ', ' '], [' ', ' ', '#', '#', ' ', ' ', '#', '#'], [' ', ' ', '#', '#', ' ', ' ', '#', '#'], ['#', '#', ' ', ' ', '#', '#', ' ', ' '], ['#', '#', ' ', ' ', '#', '#', ' ', ' ']] # 示例2:chequerboard(5, 7, 2, 3) [['#', '#', '#', ' ', ' ', ' ', '#'], ['#', '#', '#', ' ', ' ', ' ', '#'], [' ', ' ', ' ', '#', '#', '#', ' '], [' ', ' ', ' ', '#', '#', '#', ' '], ['#', '#', '#', ' ', ' ', ' ', '#']]
实现思路
核心逻辑是通过单元格的行列索引判断其所属的区块组:
- 对第
i行(从0开始计数),计算横向区块编号:block_row = i // offset_h - 对第
j列(从0开始计数),计算纵向区块编号:block_col = j // offset_w - 若
block_row + block_col为偶数,该单元格属于与左上角同色的区块(填充'#');若为奇数,则填充空格' '
此逻辑自动兼容边缘的不完整区块,因为整数除法//会将剩余行/列归入最近的区块组。
代码实现
def chequerboard(n, m, offset_h, offset_w): board = [] for i in range(n): current_row = [] block_row = i // offset_h for j in range(m): block_col = j // offset_w current_row.append('#' if (block_row + block_col) % 2 == 0 else ' ') board.append(current_row) return board
验证示例
运行示例1代码:
result = chequerboard(6, 8, 2, 2) for row in result: print(row)
输出与题目示例完全一致。
运行示例2代码:
result = chequerboard(5, 7, 2, 3) for row in result: print(row)
同样符合预期输出。
内容的提问来源于stack exchange,提问作者user9493162
相关产品推荐
相关产品推荐

