前言
“伤脑筋十三块”,又被称为“八阵图”,这款玩具基于“伤脑筋十二块”的基础上,将其可玩性、多变性升华到了极致。
“伤脑筋十三块”既具备了一共有16146种平面装法(翻转、旋转均算一种),假若将十三块积木置于方盒之外,可以拼成汉字、动物、建筑物等等任何您所能想象到的物体,玩法更是不计其数,这就是“伤脑筋十三块”的微妙之处:玩物知志、寓教于乐!
一、解决思路
1.1. 解决思路
- 遍历所有可能的排列
- 对所有的组合进行验证,去除所有不能完美放入盒子的排列
1.2 存在问题
全部可能的排列一共13!(6227020800)种,每种排列又有2*45*85(67108864)种旋转、翻转状态,共计87756541318397952000(8.77×1019)各排列,根本无法在有限时间内全部验证可行性
1.3 解决方法
按遍历顺序,每块各种依次填入空格中,每增加一块积木,验证可行性,如果内部存在不可填充满的空隙、或者内部存在重叠区域,那么以前面几块积木开始的所有排列都是不可行,可以直接跳过,这样可以大大减小验证次数。
二、问题解决
1. 积木抽象
将所有积木简化成一个最小的二维矩阵,空的地方是0,实的地方置1,为简化计算,全部转化成numpy数组
文件名:config.py,代码如下:
import numpy as np
parts = [
[[1, 1, 1, 1],
[1, 0, 0, 0]],
[[1, 1],
[1, 1],
[1, 0]],
[[1, 1, 1, 1],
[0, 1, 0, 0]],
[[1, 1, 1, 1, 1]],
[[1, 0, 0],
[1, 1, 0],
[0, 1, 1]],
[[1, 0, 0],
[1, 1, 1],
[1, 0, 0]],
[[1, 1, 0],
[0, 1, 1],
[0, 1, 0]],
[[1, 1],
[1, 1]],
[[1, 1, 0],
[0, 1, 0],
[0, 1, 1]],
[[0, 1, 0