JOJ-2165-Hilbert Curve


The pictures above are Hilbert curve.You can see a Hilbert curve with a certain recursion depth n is composed of four different Hilbert curves with a certain recursion depth n-1 and three segments.

For this problem, you are to output the Hilbert Curve up to a certain recursion depth, using just 'X'.Draw the smallest Hilbert curve (that is not divided any further) as follows:

XXX
X
XXX
To see how to draw larger Hilbert curve, take a look at the sample output.

Input

The input contains several testcases. Each is specified by an integer n (1 < n < 9).

Output

For each test case, output the Hilbert curve with the certain recursion depth n.The output must not contain any trailing blanks. Print an empty line after each test case.

Sample Input

2
3

Sample Output

XXXXX X
X   X X
XXX XXX
  X
XXX XXX
X   X X
XXXXX X

XXXXX XXXXX XXX
X   X X   X X
XXX XXX XXX XXX
  X     X     X
XXX XXX X XXX X
X   X X X X X X
XXXXX X XXX XXX
      X
XXXXX X XXX XXX
X   X X X X X X
XXX XXX X XXX X
  X     X     X
XXX XXX XXX XXX
X   X X   X X
XXXXX XXXXX XXX





#include<iostream> using namespace std; void main() { int lines[9]; lines[0]=1; for(int i=1;i<9;i++) lines[i]=lines[i-1]*2+1; char Hilbert[520][520]; Hilbert[0][0]='X'; int r=1; for(int i=1;i<9;i++) { for(int j=0;j<r;j++) for(int k=0;k<r;k++) { Hilbert[j][r+1+k]=Hilbert[k][r-1-j]; Hilbert[r+1+j][k]=Hilbert[j][k]; Hilbert[r+1+j][r+1+k]=Hilbert[r-1-k][j]; } Hilbert[0][r]='X'; Hilbert[r][r-1]='X'; Hilbert[2*r][r]='X'; r=r*2+1; } int n; while(cin>>n) { for(int i=0;i<lines[n];i++) { int len=lines[n]-1; while(Hilbert[i][len]!='X') len--; for(int j=0;j<=len;j++) if(Hilbert[i][j]=='X') cout<<Hilbert[i][j]; else cout<<' '; cout<<endl; } cout<<endl; } }
 
 
 
沒有對數組進行初始化,如果全部先賦爲空格反而會費時間 在打印時判斷更好
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章