九度oj 题目1345:XXX定律之画X

题目描述:

给你一个n,然后让你输出F(n)
规则是这样的,F(n)的输出结果是:
F(n-1)     F(n-1)
      F(n-1)
F(n-1)      F(n-1)
F(1)的输出结果是:X
那么根据规则F(2)的输出结果应该是:
X X
 X 
X X

输入:

题目有多组输入,每组输入一个n(n<=7)。
当输入零或负数的时候结束输入。

输出:

对每组输入输出相应的F(n),每组输出最后一行是‘#’。

样例输入:
1
2
3
-1
样例输出:
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
#

这道题有点意思,代码如下
 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <iostream>
 5 using namespace std;
 6 
 7 char mat[800][800];
 8 int len[] = {0,1,3,9,27,81,243,729};
 9 void copy(int x, int y, int base) {
10     for(int i = x, p = 1; i < x + base; i++, p++) {
11         for(int j = y, q = 1; j < y + base;q++, j++) {
12             mat[i][j] = mat[p][q];
13         }
14     }
15 }
16 
17 void calf() {
18     mat[1][1] = 'X';
19     for(int i = 2; i <= 7; i++) {
20         int base = len[i-1];
21         copy(base*2+1,1,base);
22         copy(base+1,base+1,base);
23         copy(1,base*2+1,base);
24         copy(base*2+1,base*2+1,base);
25     }
26 }
27 
28 int n;
29 int main(int argc, char const *argv[])
30 {
31     
32     memset(mat,' ', sizeof(mat));
33     calf();
34     while(scanf("%d",&n) != EOF && n > 0) {
35         for(int i = 1; i <= len[n]; i++) {
36             for(int j = 1; j <= len[n]; j++) {
37                 printf("%c",mat[i][j]);
38             }
39             puts("");
40         }
41         puts("#");
42     }
43 }
原文地址:https://www.cnblogs.com/jasonJie/p/5787198.html