三角网格由边长为 1 的等边三角形组成(见第 3 页)。三角网格中的路径是网格中三角形(边长为 1)的任意有限序列,使得每两个连续的三角形共享一条边。
由有限数量的三角形的点所构成的形状称为岛屿,如果该形状中包含的网格中的任意两个三角形都可以通过该形状内包含的三角形所构成的路径连接起来。
图 1.1、1.2 和 1.3 中的形状是岛屿。图 1.4 中的形状不是岛屿。图 2.2、2.3 和 2.5 中的形状是全等的。
我们的目标是针对每个 $n \le 10$,系统地描述所有由 $n$ 个边长为 1 的三角形构成的非全等岛屿,并计算此类岛屿的数量。
每个由最多 10 个三角形构成的岛屿的边界都是由网格的单位线段组成的多边形链。它可以被绕行,即可以在不将笔从纸上移开的情况下勾勒出轮廓,使得每条线段都被经过一次,并回到初始点。不过,某些点可能会被经过多次(见图 2.4)。
幸运的是,对于由最多 10 个三角形构成的岛屿,形状的周长是连通的(因此可以在不将笔从纸上移开的情况下勾勒出轮廓),这与图 1.2 中的情况不同。
在绕周长转动时,每经过一条单位线段,我们进行以下类型的转弯之一:
- $\texttt{a}$ - 向左转 120 度,
- $\texttt{b}$ - 向左转 60 度,
- $\texttt{c}$ - 0 度(即实际上不转弯),
- $\texttt{d}$ - 向右转 60 度,
- $\texttt{e}$ - 向右转 120 度。
绕岛屿的每个循环都可以用一个由集合 $\{\texttt{a},\texttt{b},\texttt{c},\texttt{d},\texttt{e}\}$ 中的字母组成的单词来描述,其中每个字母表示在周长由其组成的每条连续单位线段之后应进行的转弯。循环描述包含的字母数量与周长包含的单位线段数量相同。这意味着我们也描述了多边形链最后一条线段之后的转弯,尽管这对于唯一确定形状并不是必需的。然而,这个冗余的字母在将一个绕形状的循环描述转换为另一个仅在起点上不同的描述时非常有用。
单词 $\texttt{cdddcddd}$、$\texttt{dcdddcdd}$、$\texttt{cbbbcbbb}$ 描述了图 2.1 形状的不同循环。
单词 $\texttt{cbeddcde}$、$\texttt{adcabcbb}$、$\texttt{abcbbadc}$ 描述了图 2.2 形状的不同循环。
单词 $\texttt{acdabbcb}$ 和 $\texttt{cddebced}$ 描述了图 2.3 形状的不同循环。
如果在绕某个形状的循环过程中,形状的内部始终位于右侧,我们称这种循环为顺时针循环。
对于每个岛屿,可以确定与它全等的所有岛屿的集合以及这些岛屿的顺时针循环。岛屿的代码是一个满足以下条件的单词:
- 它是与后者全等的某个岛屿轮廓的顺时针循环的描述,
- 它是所有满足上述条件的单词中字典序最小的。
对于图 2.2 和 2.3 中描绘的岛屿(它们是全等的),我们考虑它们各自的所有顺时针循环:
以及
因此它们的共同代码是:bcedcdde,即上述所有单词中字典序最小的一个。
图 2.4 中描绘的岛屿的代码是:aadecddcddde。
编写一个程序:
- 对于给定的一个大小为 $k$ 的岛屿代码,生成所有可以通过向其添加一个三角形而获得的大小为 $k+1$ 的岛屿代码,
- 对于给定的整数 $n$,生成所有大小为 $n$ 的岛屿代码。
标准输入的第一行包含一个整数 $t$ ($1 \le t \le 5$),表示查询的数量。接下来的 $t$ 行中,每一行包含一个查询。类型 1 的查询由字母 $K$ 和一个由最多 10 个三角形构成的岛屿代码组成,中间用空格隔开。类型 2 的查询由字母 $N$ 和一个整数 $n$ ($1 \le n \le 10$) 组成,中间用空格隔开。
答案应打印到标准输出。
对于类型 1 的查询,输出可以通过从与给定代码描述的岛屿全等的岛屿中添加一个三角形所能获得的岛屿的不同代码数量。在下一行中,应按字典序打印所有这些代码,并用空格隔开。
对于类型 2 的查询,应打印由 $n$ 个三角形构成的不同岛屿的代码数量。在下一行中,应按字典序打印所有这些代码。
样例
输入格式 1
2 K adeccecced N 5
输出格式 1
5 acedccecced addebcecced adebebecced adecbedcced cceccecce 4 aedddde bdecdde bececde ccedcde