给出一个数,一开始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; }
浙公网安备 33010602011771号