#P16418. pm_2824索玛积木拼法计数
pm_2824索玛积木拼法计数
索玛积木(Soma)
题目背景
索玛立方体(Soma cube)是 Piet Hein 发明的一种三维拼图。
整套拼图由七块积木组成。每块积木都是若干单位立方体通过面连接形成的非凸立体:
- 其中六块由 个单位立方体组成;
- 另有一块由 个单位立方体组成。
因此,七块积木一共包含:
个单位立方体。
现在给定一个同样由 个单位立方体组成的目标形状,请计算使用全部七块索玛积木拼成该形状的不同方案数。
七块索玛积木
题目使用二维高度矩阵描述三维形状。
矩阵中的每个数字表示:从同一个高度为 的平面开始,该位置竖直堆叠了多少个单位立方体。
七块积木分别可以描述为:
111 111 011
100 010 110
以及:
11 02 20 12
10 11 11 01
每个高度矩阵只描述该积木的一种初始朝向。
在拼装时,每块积木均可以:
- 在三维空间中平移;
- 绕任意坐标轴旋转。
但不允许:
- 对积木进行镜像翻转;
- 拆开积木;
- 让不同积木占据同一个单位立方体。
积木之间可以通过面、边或顶点相接。
每一块积木都必须恰好使用一次。
题目描述
给定一个由 行、 列数字组成的高度矩阵 pattern。
第 行第 列的数字 表示:在平面位置 上,从高度 开始连续堆叠:
个单位立方体。
也就是说,该位置包含三维坐标:
上的单位立方体。
数字 0 表示该平面位置上没有立方体。
所有数字之和恰好为 。目标形状不一定连通。
你需要把七块索玛积木分别旋转和平移,使得:
- 每块积木的所有单位立方体都落在目标形状中;
- 任意两块积木不重叠;
- 目标形状中的每个单位立方体恰好被一块积木占据;
- 七块积木全部恰好使用一次。
请计算满足条件的不同拼法数量。
不同方案的定义
在一个合法方案中,可以给目标形状中的每个单位立方体标记一个 到 的编号,表示占据它的是哪一块积木。
若两个方案中至少有一个目标单位立方体所对应的积木编号不同,则这两个方案不同。
因此:
- 若一块具有旋转对称性的积木被取出、旋转后又放回完全相同的单位立方体集合中,不会产生新的方案;
- 若若干积木重新排列后,目标形状中至少有一个单位立方体改由另一块积木占据,则属于不同方案;
- 即使一种重新排列等价于对整个目标形状进行旋转或镜像,只要在题目给定的固定坐标中,单位立方体与积木编号的对应关系发生变化,也要计为不同方案。
输入格式
第一行包含两个整数 ,分别表示高度矩阵的行数和列数。
接下来 行,每行包含一个长度为 的数字字符串,描述目标形状的高度矩阵。
字符串中不包含空格。
输出格式
输出一个整数,表示使用全部七块索玛积木拼成目标形状的不同方案数。
若无法拼成目标形状,输出 0。
数据范围
对于所有测试数据:
- ;
- ;
- 每行均包含恰好 个字符;
- 每个字符均为
0到9; - 所有数字之和恰好为 ;
- 答案可以使用有符号 位整数表示。
样例 1
输入
3 3
333
333
333
输出
11520
解释
目标形状是一个 的立方体,共有 种不同拼法。
样例 2
输入
3 3
345
234
123
输出
2800
样例 3
输入
3 3
225
225
225
输出
260
样例 4
输入
3 7
3330000
0033300
0000333
输出
28
样例 5
输入
5 5
33000
03300
00330
00033
00003
输出
92
样例 6
输入
3 8
21111111
21111111
21111111
输出
0
解释
虽然该目标形状同样由 个单位立方体组成,但无法使用七块索玛积木拼成。
样例 7
输入
2 2
67
77
输出
1520