python遍历法解决伤脑筋的十三块全部可行解


前言

“伤脑筋十三块”,又被称为“八阵图”,这款玩具基于“伤脑筋十二块”的基础上,将其可玩性、多变性升华到了极致。
“伤脑筋十三块”既具备了一共有16146种平面装法(翻转、旋转均算一种),假若将十三块积木置于方盒之外,可以拼成汉字、动物、建筑物等等任何您所能想象到的物体,玩法更是不计其数,这就是“伤脑筋十三块”的微妙之处:玩物知志、寓教于乐!
在这里插入图片描述

一、解决思路

1.1. 解决思路

  1. 遍历所有可能的排列
  2. 对所有的组合进行验证,去除所有不能完美放入盒子的排列

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值