很高兴看到这个问题有两个赞成票。我现在将重新提出我的问题以避免混淆。
问题是如何用没有孔的随机但预定义的形状填充 mxn 网格/矩阵。预定义的形状有一个变量 k,它是由多少块组成的形状。每个块都是一个正方形,并且与一个网格正方形(即 1x1 网格)大小相同。形状可以旋转以适应网格,但不会缩小或扩大。k 在一轮中不会改变,换句话说,当我运行答案脚本时,m、n 和 k 不会改变。当我第二次运行脚本时,我可能会更改其中的一个或全部。例如,第一次,我可能运行 k=4、m=10 和 n=20 的答案脚本。脚本完成并打印输出。第二次我将 k=3、m=6 和 n=10。我将保证 m 乘以 n 并且乘积调制 k 等于零(mxn % k = 0),以确保它们在数学上相互匹配。好的,还有一个条件:1
该脚本需要使用预设 k 池中的随机形状填充网格。当 k=2 时,预定义的形状只有一种,两个块在一起。如果你认为没有旋转,那么它有两种,水平和垂直。当k=4 时,基本上就是用俄罗斯方块填满了网格,即总共有7 种预定义的形状(每种都可以旋转,并且可以制作~20 种)。k=5 的预定义形状是什么,我还不知道。答案可以计算出来,也可以硬编码,因为不难找到 k=5 的所有形状。
如果解是有限的,则不需要随机数。例如,m=2、n=2、k=4;或 m=1,n=4,k=2。没有其他办法,没有随机性。
网格中的任何地方都不能留下任何孔。我认为,没有经过证明的想法,许多 mxn 和 mxn%k=0 的网格将有一个没有孔的解决方案。直觉上这听起来很合理,但在数学上我不知道。如果 m 或 n 是 k 的倍数,则保证有解(所有直条)。
理想情况下,我希望 k 是一个小整数,例如 k<10,但在 2 到 5 的范围内是可以接受的。如果更简单,我们可以在这里有一个固定的 k,比如 4,因为俄罗斯方块带有众所周知的 7 个形状(ITOLJSZ)。
我正在寻找最好在 Perl 中的解决方案。Python也不错。程序每次运行需要 m、n 和 k。同样,我将让 m,n,k 适合 mxn%k=0。
我自己的努力,我在 Perl 中尝试过,可以解决一些 k=3 的情况,并且由于边缘/角落中的单例(孔)而失败了一些情况。需要一种检查是否有任何块变成单例的好方法。我的文本输出如下所示(m=4,n=9,k=3)。您当然可以使用这种或任何有意义的格式。
AABB
ACCB
DCEE
DFFE
DFGH
IGGH
IIJH
KKJJ
KLLL
我将设置 100 分的赏金(感谢那两个投票,我现在有 107 个声望)来奖励最佳解决方案。
感谢您的输入。