三角形网格由边长为1的等边三角形组成(见第3页)。三角形网格中的路径是网格的任意有限三角形序列(边长为1),使得每两个连续的三角形共享一条边。
由任意有限个三角形的点形成的形状称为岛,如果该形状中包含的网格的任意两个三角形通过由该形状中所包含的三角形形成的路径连接。
图1.1、1.2和1.3中的形状是岛。
图1.4中的形状不是岛。
图2.2、2.3和2.5中的形状是一致的。
我们的目标是对每一个可以由边长为1的三角形形成的所有非全等岛进行系统描述,并计算有多少个这样的岛。
由最多十个三角形形成的每个岛的边界是由网格的单一段组成的多边形链。它可以旋转,即。
它可以在不将铅笔从纸上拆下的情况下进行轮廓绘制,这样它的每一个片段都会跟随一次,然后我们回到最初的点。尽管某些点可能需要多次跨越(见图2.4)。
幸运的是,如果是由最多十个三角形形成的岛,形状的周长是连接的(因此可以在不将铅笔从纸上分离的情况下绘制轮廓),这与图1.2中的不同。
在围绕周界盘旋时,在每个单位段之后,我们进行以下任一类型的转弯:
a-向左120度,b-向左60度,c-0度(即实际上不转弯),d-向右60度,e-向右120度。
围绕小岛的每一个循环都可以用一个单词来描述,该单词由集合中的字母组成,其中每个字母表示在周长组成的每个连续单位段之后应该进行哪个转弯。周期描述的字母数与单位段的数量相同。这意味着我们还描述了多边形链的最后一段之后的转弯,即使不需要唯一确定形状。然而,这个多余的字母非常有助于将围绕形状的循环的一种描述转换为仅在初始点不同的另一种描述。
单词cdddcddd、dcdddcdd、cbbbcbbb描述了围绕图2.1形状的不同循环。
单词cbeddcde、adcabcbb、abcbbadc描述了围绕图2.2形状的不同循环。
单词acdabbcb i cddebed描述了围绕图2.3形状的不同循环。
如果在围绕某个形状的循环过程中,该形状的内侧始终位于右侧,我们称这种循环为顺时针循环。
对于每个岛屿,可以确定与之一致的所有岛屿的集合以及这些岛屿的顺时针循环。
小岛的代码是这样一个词:
它描述了一个围绕某个岛屿轮廓的顺时针循环,与后者一致,它是满足前一条件的所有单词中词汇表上最小的一个。
对于图2.2和2.3所示全等的岛屿,我们考虑了围绕每个岛屿的所有顺时针循环:
beddcdec,eddcdecb,ddcdecbe,dcdecbed,cdecbedd,decbeddc,ecbeddcd,cbeddcde和bcedcdde,cedcddeb,edcddebc,dcddebce,cddebed,ddebcedc,debcedcd,ebcedcdd,所以它们的通用代码是:bcedcdd,上面所有单词中词汇最小的。
图2.4所示岛屿的代码为:aadecddcddde。
编写一个程序:
对于一个大小岛的给定代码,生成所有大小岛的代码,这些代码可以通过向其添加一个三角形从后者获得,对于一个给定的整数,生成所有尺寸岛的代码。
在标准输入的第一行中,给出了表示查询数量的整数()。
以下每行都包含某种类型的查询。
类型1的查询由字母K和由最多十个三角形组成的岛的代码组成,由单个空格分隔。
类型2的查询由字母N和一个整数()组成,用一个空格分隔。
查询的答案应打印到标准输出中。
对于类型1的查询,可以通过将一个与给定代码所描述的三角形相同的三角形与一个三角形相加而获得的岛屿的不同代码的数量。
在下一行中,所有这些代码(用单个空格分隔)应按词典顺序打印。
对于类型2的查询,应打印三角形形成的岛的不同代码的数量。
在下面的一行中,所有这些代码都应按词典顺序打印。