#P16418. pm_2824索玛积木拼法计数

pm_2824索玛积木拼法计数

索玛积木(Soma)

题目背景

索玛立方体(Soma cube)是 Piet Hein 发明的一种三维拼图。

整套拼图由七块积木组成。每块积木都是若干单位立方体通过面连接形成的非凸立体:

  • 其中六块由 44 个单位立方体组成;
  • 另有一块由 33 个单位立方体组成。

因此,七块积木一共包含:

6×4+3=276\times 4+3=27

个单位立方体。

现在给定一个同样由 2727 个单位立方体组成的目标形状,请计算使用全部七块索玛积木拼成该形状的不同方案数。

七块索玛积木

题目使用二维高度矩阵描述三维形状。

矩阵中的每个数字表示:从同一个高度为 00 的平面开始,该位置竖直堆叠了多少个单位立方体。

七块积木分别可以描述为:

111    111    011
100    010    110

以及:

11    02    20    12
10    11    11    01

每个高度矩阵只描述该积木的一种初始朝向。

在拼装时,每块积木均可以:

  • 在三维空间中平移;
  • 绕任意坐标轴旋转。

但不允许:

  • 对积木进行镜像翻转;
  • 拆开积木;
  • 让不同积木占据同一个单位立方体。

积木之间可以通过面、边或顶点相接。

每一块积木都必须恰好使用一次。

题目描述

给定一个由 HH 行、WW 列数字组成的高度矩阵 pattern

ii 行第 jj 列的数字 pi,jp_{i,j} 表示:在平面位置 (i,j)(i,j) 上,从高度 00 开始连续堆叠:

pi,jp_{i,j}

个单位立方体。

也就是说,该位置包含三维坐标:

(i,j,0),(i,j,1),,(i,j,pi,j1)(i,j,0),(i,j,1),\ldots,(i,j,p_{i,j}-1)

上的单位立方体。

数字 0 表示该平面位置上没有立方体。

所有数字之和恰好为 2727。目标形状不一定连通。

你需要把七块索玛积木分别旋转和平移,使得:

  1. 每块积木的所有单位立方体都落在目标形状中;
  2. 任意两块积木不重叠;
  3. 目标形状中的每个单位立方体恰好被一块积木占据;
  4. 七块积木全部恰好使用一次。

请计算满足条件的不同拼法数量。

不同方案的定义

在一个合法方案中,可以给目标形状中的每个单位立方体标记一个 1177 的编号,表示占据它的是哪一块积木。

若两个方案中至少有一个目标单位立方体所对应的积木编号不同,则这两个方案不同。

因此:

  • 若一块具有旋转对称性的积木被取出、旋转后又放回完全相同的单位立方体集合中,不会产生新的方案;
  • 若若干积木重新排列后,目标形状中至少有一个单位立方体改由另一块积木占据,则属于不同方案;
  • 即使一种重新排列等价于对整个目标形状进行旋转或镜像,只要在题目给定的固定坐标中,单位立方体与积木编号的对应关系发生变化,也要计为不同方案。

输入格式

第一行包含两个整数 H,WH,W,分别表示高度矩阵的行数和列数。

接下来 HH 行,每行包含一个长度为 WW 的数字字符串,描述目标形状的高度矩阵。

字符串中不包含空格。

输出格式

输出一个整数,表示使用全部七块索玛积木拼成目标形状的不同方案数。

若无法拼成目标形状,输出 0

数据范围

对于所有测试数据:

  • 2H272\le H\le 27
  • 2W272\le W\le 27
  • 每行均包含恰好 WW 个字符;
  • 每个字符均为 09
  • 所有数字之和恰好为 2727
  • 答案可以使用有符号 3232 位整数表示。

样例 1

输入

3 3
333
333
333

输出

11520

解释

目标形状是一个 3×3×33\times3\times3 的立方体,共有 1152011520 种不同拼法。

样例 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

解释

虽然该目标形状同样由 2727 个单位立方体组成,但无法使用七块索玛积木拼成。

样例 7

输入

2 2
67
77

输出

1520