给出一个数,一开始1只有一个X,然后大于1的数通过小于他的数的形状进行分裂变形合成。

例如样例:

1 X
-
2 X X
   X
  X X
-
3 X X   X X
   X     X
  X X   X X
     X X
      X
     X X
  X X   X X
   X     X
  X X   X X
-
这题最大的N是7,观察样例可以发现第n个数的行列是3

n-1

,因为他是通过小的形状3*3合成的。
那么7的时候3

6

有729行,想通过复制粘贴的办法有点没法= =

其实这题很明显可以递归合成,考虑n的形状,可以知道是通过n-1然后复制5处得到的。所以首先要得到n-1的形状,再用它来合成n。
代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
typedef long long ll;

int n;
char pic[2333][2333];
int pow(int a,int b)
{
    int ret=1;
    while(b)
    {
        if(b&1)
            ret=ret*a;
        a=a*a;
        b>>=1;
    }
    return ret;
}
void dfs(int x)
{
    if(x==1){
        pic[x][x]='X';
        return ;
    }
    dfs(x-1);
    int tx=pow(3,x-1);
    x=tx/3;
    
    for(int i=1;i<=x;++i)
        for(int j=1;j<=3*x;++j)
            if(j>x&&j<=2*x)
                continue;
            else pic[i][j]=pic[i][j>2*x?j-2*x:j];
    for(int i=x+1;i<=2*x;++i)
        for(int j=x+1;j<=2*x;++j)
            pic[i][j]=pic[i-x][j-x];
    for(int i=2*x+1;i<=3*x;++i)
        for(int j=1;j<=3*x;++j)
            pic[i][j]=pic[i-2*x][j];
}
int main(int argc, char **argv) {
    while(cin>>n,n!=-1){
        
        int tx=pow(3,n-1);
        for(int i=1;i<=tx;++i)
            for(int j=1;j<=tx;++j)
                pic[i][j]=' ';
        dfs(n);
        for(int i=1;i<=tx;++i){
            for(int j=1;j<=tx;++j)
                cout<<pic[i][j];
            cout<<endl;
        }
        cout<<'-'<<endl;
    }
    return 0;
}

 

posted on 2018-04-27 10:04  chagin  阅读(144)  评论(0)    收藏  举报