如何使用Python生成符合指定规则的Binary Puzzle(二进制谜题)已解网格
二进制谜题已解网格生成实现方案
首先明确前提:网格边长CELL必须为偶数,否则无法满足每行/列0和1数量相等的要求。
实现思路
放弃全网格纯随机生成的方案,改为逐行生成+实时校验约束,不符合约束立刻丢弃重试,大幅降低无效计算量:
- 先预先生成所有满足「相邻相同数字不超过2个」、「0和1数量相等」的合法行候选池
- 从候选池中随机选不重复的行拼接为网格,每拼接一行就校验垂直方向约束、列01数量约束
- 网格拼接完成后最后校验列不重复约束
核心代码实现
import numpy as np from itertools import product CELL = 6 # 可自行修改为其他偶数值 HALF = CELL // 2 # 1. 预先生成所有合法的行候选 def is_valid_line(line): # 校验0和1数量相等 if sum(line) != HALF: return False # 校验相邻相同数不超过2个 for i in range(len(line)-2): if line[i] == line[i+1] == line[i+2]: return False return True # 生成所有长度为CELL的01组合,过滤出合法行 all_valid_rows = [list(row) for row in product([0,1], repeat=CELL) if is_valid_line(row)] # 2. 生成符合所有规则的网格 def generate_valid_grid(): while True: grid = [] used_rows = set() for _ in range(CELL): # 随机选未使用过的合法行 while True: candidate = all_valid_rows[np.random.randint(0, len(all_valid_rows))] candidate_tuple = tuple(candidate) if candidate_tuple not in used_rows: break grid.append(candidate) used_rows.add(candidate_tuple) # 校验垂直相邻相同数不超过2个 if len(grid) >=3: valid_vertical = True for col in range(CELL): if grid[-1][col] == grid[-2][col] == grid[-3][col]: valid_vertical = False break if not valid_vertical: break # 提前校验当前每列的0/1数量不超过半数,避免最终超出限制 current_cols = np.array(grid).T valid_col_count = True for col in current_cols: if sum(col) > HALF or (len(col) - sum(col)) > HALF: valid_col_count = False break if not valid_col_count: break # 全部行生成完成,做最终规则校验 if len(grid) == CELL: grid_np = np.array(grid) # 校验所有列是否满足相邻规则、01数量相等规则 cols_valid = all(is_valid_line(col) for col in grid_np.T) # 校验所有列不重复 cols = [tuple(col) for col in grid_np.T] cols_unique = len(set(cols)) == CELL if cols_valid and cols_unique: return grid_np # 调用生成合法网格 valid_grid = generate_valid_grid() print(valid_grid)
逻辑说明
预生成合法行候选池的步骤提前过滤了不符合行规则的内容,大幅减少后续重试概率;逐行拼接时实时校验垂直相邻和列数量约束,避免生成完所有行才发现问题;最终额外校验列的所有规则,确保生成结果完全符合要求。
内容的提问来源于stack exchange,提问作者leo
相关产品推荐
相关产品推荐

