二进制反射格雷码和Tromino问题Python代码实现
实现n位二进制反射格雷码(采用递归的减治法)
算法设计思想
n+1 位格雷码的前 2^n 个二进制串,可以由依此算法生成的 n 位格雷码(总共 2^n 个 n 位二进制串)按顺序排列,再在每个串前加一个前缀 0 构成。
n+1 位格雷码的后 2^n 个二进制串,可以由依此算法生成的 n 位格雷码(总共 2^n 个 n 位二进制串)按逆序排列,再在每个串前加一个前缀 1 构成。
具体步骤描述
输入二进制反射格雷码的位数n
递归调用
BRGC_Recursion
函数n 等于1 时返回包含 0 和 1 字串的列表
n 不等于 1 时处理递归返回的列表
先复制一份并翻转
在原本返回的列表中的每个字串前添加 0
在复制翻转后的列表中的每个字串前添加 1
返回两个列表合并后的列表
实现源码
1 |
|
运行结果截图

实现n位二进制反射格雷码(非递归算法实现)
算法设计思想
以全 0 的 n 位串开始。
对于 i = 1,2,3 ,···, 2^(n-1), 则通过翻转前一位串中的第 b 位来生成第 i 个位串,前这里 b 是 i 的二进制表示中最低位 1 的位置
具体步骤描述
输入二进制反射格雷码的位数n
初始化结果列表中的第一个字串,为 n 个 0
设置结束为 2 的 n 次方,遍历时则为 1 到 2^(n-1)
将 i 转换成 n 位二进制字串
从右向左寻找 i 的二进制字串中第一个 1 的索引
将结果列表中最后一个字串中,对应索引位置的修改
- 如果为 '1' 则换为 '0',否则换为 '1'
实现源码
1 |
|
运行结果截图

分治法实现2^n*2^n棋盘覆盖问题,棋盘用二维数组表示,缺失方块0填充,L型骨牌用相同整数填充。
算法设计思想
将棋盘依次划分为四个象限,k所在象限继续划分。
k不在的剩余三个象限,将划分轴原点附近的剩余三个点,标志为L型骨牌
k不在的象限继续划分,并将之前标志为L型骨牌的点看做缺失点k
依次类推,当划分棋盘大小size等于1时结束
具体步骤描述
输入 n 和 k 在棋盘中的坐标
初始化棋盘
将棋盘分为四个象限,k 所在的象限直接递归调用 Tromino
对于 k 不在的三个象限,将划分轴原点附近的剩余三个点,标志为L型骨牌(以相同的数字表示)
k不在的象限继续划分,并将之前标志为 L型骨牌的点 看做缺失点 k
依次类推,当划分棋盘大小size等于1时结束
实现源码
1 |
|
运行结果截图
