Tromino谜题的解法

    技术2022-05-20  33

    题目:Tromino 是一个由棋盘上的三个邻接方块组成的L型瓦片,我们的问题是,如何用tromino覆盖一个缺少了一个方块(可以在棋盘上的任何位置)的(2^n)*(2^N)棋盘。除了这个缺少的方块,tromino应该覆盖棋盘上的所有方块,而且不能重叠。

    原题见《算法设计与分析基础》98页。

     

    思想是使用分治法,即把大问题划分为几个小问题。8*8的化为4个4*4的,4*4的化为四个2*2的,当化为2*2的时候,解法就很简单了,直接把2*2矩阵中另外三个位置用L型瓦片覆盖就行了。当返回到上一层4*4矩阵的时候,把与刚才2*2矩阵相邻的三个位置用一块瓦片覆盖。因为瓦片占三个位置,恰好在剩下三个矩阵中每个占一个位置,然后又生成了另外三个2*2且每个都缺一个位置的问题。

     

    简要代码如下:

    Tromino(n,i,j){//n为矩阵是2的次方数,i和j为缺少的位置的坐标

    int x,y;

    if(n>1){

       if(i<2^(n-1)-1)//求出缺少点在当前矩阵的四个子矩阵中的哪一个中

          x=0;

       else x=1;

       if(j<2^(n-1)-1)

          y=0;

       else y=1;

    Tromino(n-1,i-x*2^(n-1),j-y*2^(n-1));//转化为规模小一层的问题

    L(a,b,c);//把三个位置用L型瓦片覆盖

    Trimino(n-1,...);//解决产生的三个规模小一的问题

    Trimino(n-1,...);

    Trimino(n-1,...);

    }

    if(n==1)

       L(...);//标好除去i,j位置外的三个位置

    }


    最新回复(0)