A fractal is an object or quantity that displays self-similarity, in a somewhat technical sense, on all scales. The object need not exhibit exactly the same structure at all scales, but the same "type" of structures must appear on all scales.
A box fractal is defined as below :
- A box fractal of degree 1 is simply
X
- A box fractal of degree 2 is
X X X X X
- If using B(n - 1) to represent the box fractal of degree n - 1, then a box fractal of degree n is defined recursively as following
B(n - 1) B(n - 1) B(n - 1) B(n - 1) B(n - 1)
Your task is to draw a box fractal of degree n.
Input
The input consists of several test cases. Each line of the input contains a positive integer n which is no greater than 7. The last line of input is a negative integer -1 indicating the end of input.
Output
For each test case, output the box fractal using the 'X' notation. Please notice that 'X' is an uppercase letter. Print a line with only a single dash after each test case. Don't output any trailing spaces at the end of each line, or you may get an 'Presentation Error'!
Sample Input
1 2 3 4 -1
Sample Output
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 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 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 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 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 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 X X X X X X -
分析:
此题用递归实现。
因为输出时都是从左到右,所以不能分块打印。
故考虑数组保存这个二维图形。找出规律,对于每个n,都可以递归处理5个大X,对于每个大X,又可以分成5个小X。
最后注意处理时X在数组中的位置。
代码:
以前做的,直接粘了。
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> using namespace std; const int maxn = 1000; char b[ maxn ][ maxn ]; int flag[ maxn ]; void f( int n, int x, int y ) { if ( n == 1 ){ b[ x ][ y ] = 'X'; return; } int t = ( int )pow( 3.0, n - 2 ); f( n - 1, x, y ); f( n - 1, x + t, y + t ); f( n - 1, x + 2 * t, y ); f( n - 1, x, y + 2 * t ); f( n - 1, x + 2 * t, y + 2 * t ); } int main() { int n; while ( cin >> n && n != -1 ){ memset( b, '\0', sizeof( b ) ); memset( flag, 0, sizeof( flag ) ); int i, j; int temp = ( int )pow( 3.0, n - 1 ); for ( i = 0; i < temp; i++ ){ for ( j = 0; j < temp; j++ ) b[ i ][ j ] = ' '; // b[ i ][ j ] = '\n'; } f( n, 0, 0 ); for ( i = 0; i < temp; i++ ) { for ( j = temp - 1; j >= 0; j-- ) if ( b[ i ][ j ] == 'X' ) { flag[ i ] = j; break; } } for ( i = 0; i < temp; i++ ){ for ( j = 0; j <= flag[ i ]; j++ ) printf("%c", b[ i ][ j ]); printf("\n"); } printf("-\n"); } return 0; }