zoj 2423 Fractal

来源:互联网 发布:新华阅读网软件 编辑:程序博客网 时间:2024/06/08 00:19
Fractal

Time Limit: 2 Seconds      Memory Limit: 65536 KB

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 XX 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

1234-1

Sample Output

X-X X XX X-X X   X X X     XX X   X X   X X    X   X XX X   X X X     XX X   X X-X X   X X          X X   X X X     X            X     XX X   X X          X X   X X   X X                X X    X                  X   X X                X XX X   X X          X X   X X X     X            X     XX 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 XX X   X X          X X   X X X     X            X     XX X   X X          X X   X X   X X                X X    X                  X   X X                X XX X   X X          X X   X X X     X            X     XX 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;}


0 0
原创粉丝点击