俄罗斯块中两个数学问题的解决方案.docxVIP

  • 47
  • 0
  • 约5.95千字
  • 约 7页
  • 2023-08-14 发布于广东
  • 举报

俄罗斯块中两个数学问题的解决方案.docx

俄罗斯块中两个数学问题的解决方案 1 生成的问题及求解 首先,本文必须解决1999年提出的两个数学问题。 (1) 俄罗斯方块中的5个方块(每个的面积都为4个单位格),各一片放入面积为4×5的矩形区域内(每一片都可以顺时针逆时针旋转,正反面翻转与翻转后旋转后摆放在该矩形区域中,即可以任意摆放),有没有正好将其完全覆盖的方案? (2) 在面积为6×6的正方形区域内,从5个方块中任选1个方块填充该区域(任意摆放),对于每一个方块来说有没有解? 以上两个问题目前的讨论还仅局限于“有没有解”,而通过本文的算法,不但知道有没有解,有多少个解,每个解的具体内容,而且还可以将其可解决的问题范围扩充到: 对于任何面积为m×n的矩形区域,5个俄罗斯方块每片都可以任意次摆放到该区域里(每片可以摆任意次,也可以不摆),共有多少种摆放方法,并计算每种摆放方法的图形。而上面提到的两个问题仅是这个问题的特例而已。当然,(m×n/4)的结果必须是整数,因为每个俄罗斯方块的面积都是4,所以覆盖区域面积必须要能被4整除。需要注意的是本文所谓的“所有解决方案个数”是没有考虑到对称性的,即图形上对称的两个解或者是通过翻转,反转以后为相同的两个解仍算做是两个解。 此外只要覆盖的区域是由单位面积为1×1的小正方形组成的话,即使是不规则的区域,方块不是俄罗斯方块中的那5个,不管是任何的大小与形状,不管有多少块,都可以采用该算法解决。 下面以6×6的矩形摆放区域,每块俄罗斯方块都可以摆放任意次(任意摆放,可以不摆)的情况为例,介绍算法的思想。 2 问题的算例1:某君之诉 对6×6的区域中的每一个面积为1×1的单位小正方形,从左到右、从上到下的依次标上数字以标志每个小方格,如图2所示。 假设将方形的俄罗斯方块放到该区域的左上角,则其覆盖的区域的标号为:1,2,7,8。 用一个长为36的1,0字符串,从前到后,在字符串第n位的字符对应正方形内n的编号的位置,其中1代表该位置被覆盖,0代表该位置为空,用字符串表示如下: 110000110000000000000000000000000000 共36位 而将方形放到该区域最中间的位置,表示这个覆盖情况的0,1串为: 000000000000001100001100000000000000 共36位 由上可知,5个俄罗斯方块中任何一片的所有的覆盖情况都可以用这样的0,1串表示。现在将俄罗斯方块的每一块的所有覆盖该区域的情况都表示成这种长度为36的0,1串,每块都要经过翻转,反转,在该区域内移动并摆放,以将其所有的摆放可能全部表示出来,并将所有的串作为一个0,1矩阵的行全部加入到这个矩阵里,对于该问题这个矩阵共有221行,36列。后文将这个矩阵称为A。则由于如果存在完全覆盖的可行解的话,每个单位小正方形就必须被某块俄罗斯方块覆盖过,并且只被覆盖过一次,则问题的算法思想可以抽象成: 在该矩阵A内任意取出n行作为一个新的矩阵B的行,如果B当中的每一列都有且仅有一个1,那么这组行便是该问题的一个解。 这个结论很好理解,一旦其中的某一行,即某个方块的摆放方法将该区域的某个位置覆盖的话,那其它方块就不能再次覆盖该位置,又因为要求是完全覆盖,所以是每列有且仅有一个1。 而对于该问题,这个n的值就为9,因为面积为36的区域需要9块面积为4的俄罗斯方块才能完全覆盖。选择其中的一行就相当于在该区域内摆了一个俄罗斯方块,所以只能摆9个才可能有解。 这样就可以得出下面的算法1思想: 算法1如果矩阵A为空并且已经选过了9行,则找到一组可行解,成功的返回; 否则选取1个列,c,如果在c列中不存在1的话,不成功的结束该过程; 选择c列中每一个A[r,c]=1的行,r; 将r值作为解决方案的一个步骤记录下来; 对于r行中每一个A[r,j]=1的j值,从矩阵A中将第j列删除; 对于j列中每一个A[i,j]=1的i值,从矩阵A中将第i行删除; 将已经缩小的矩阵重复进行以上运算; 算法中,将r值作为解决方案的一个步骤记录下来就是尝试进行一种摆放并记录这种摆放的操作,在这之后的那些删除操作是要排除选择第r行以后就不能再选的行,之后就是递归的进行下一步摆放的尝试。 3 标志长形的俄罗斯配方 有了这个思想,就可以知道其它的任何m×n的覆盖区域问题或者是其它问题只是初始矩阵A的内容不同而已,都可以采用这种算法解决。像上文提到的问题(2),只要让A中只有一种方块的所有摆放情况,即如果只用长形俄罗斯方块摆放的话,那么矩阵A中就只能有所有的标志长形俄罗斯方块摆放的0,1串。只要分别对由每一块方块的所有摆放的5个矩阵A都分别进行这样的运算,就可知仅摆放那一种俄罗斯方块的所有解的情况;而问题(1),则只要在每个覆盖0,1串后加入5位0,1串用来标志这5个方块(是哪个方块哪位就为1),假

文档评论(0)

1亿VIP精品文档

相关文档