AOJ 716.谢尔宾斯基三角形

Time Limit: 3000 ms   Case Time Limit: 3000 ms   Memory Limit: 128 MB
Total Submission: 116   Submission Accepted: 35
 
Description
谢尔宾斯基三角形(Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出。下面的图片就是谢尔宾斯基三角形的一个简单例子。

现在,Roll想在自己的电脑中画出这个图形,他要求不高,只要实现一个控制台版本就好,也不需要行首的空格缩进,下面是一个25行的控制台版本的谢尔宾斯基三角形例子。(具体的字符可以参考样例输出)


你能帮他实现么

 

Input
包含多组输入,EOF结束,每组输入包含一行,每行有一个数字N,表示要输出的是N行的谢尔宾斯基三角形。
1 <= N <= 512

 

Output
对于每组输入,输出一个N行的谢尔宾斯基三角形。

 

Sample Input
Original Transformed
1
2
3
25

 

Sample Output
Original Transformed
*
*
**
*
**
* *
*
**
* *
****
*   *
**  **
* * * *
********
*       *
**      **
* *     * *
****    ****
*   *   *   *
**  **  **  **
* * * * * * * *
****************
*               *
**              **
* *             * *
****            ****
*   *           *   *
**  **          **  **
* * * *         * * * *
********        ********
*       *       *       *

 

Source
谢尔宾斯基三角形

 

可以找到规律:n~2n-2行的内容是1~n-1行的内容水平放置两份

递推出关系即可

 

 1 /*
 2     By:OhYee
 3     Github:OhYee
 4     Email:oyohyee@oyohyee.com
 5     Blog:http://www.cnblogs.com/ohyee/
 6 
 7         かしこいかわいい?
 8         エリーチカ!
 9         要写出来Хорошо的代码哦~
10 */
11 #include <cstdio>
12 #include <algorithm>
13 #include <cstring>
14 #include <cmath>
15 #include <string>
16 #include <iostream>
17 #include <vector>
18 #include <list>
19 #include <stack>
20 using namespace std;
21 
22 #define REP(n) for(int o=0;o<n;o++)
23 
24 const int maxn = 512 + 5;
25 bool d[maxn][maxn];
26 
27 //将1~n-1行的内容拷贝两份在n~2n-2行(超过maxn时返回)
28 void copy(int n) {
29     for(int i = 1;i < n;i++) {
30         if(i + n - 1 < maxn)
31             for(int j = 1;j <= i;j++)
32                 d[i + n - 1][j] = d[i + n - 1][j + n - 1] = d[i][j];
33         else
34             break;
35     }
36 }
37 
38 int main() {
39     memset(d,false,sizeof(d));
40     d[1][1] = 1;
41 
42     for(int i = 2;i < maxn;i = 2 * i - 1)
43         copy(i);
44 
45     int n;
46     while(scanf("%d",&n) != EOF)
47         for(int i = 1;i <= n;i++) {
48             for(int j = 1;j <= i;j++) {
49                 printf("%c",d[i][j] ? '*' : ' ');
50             }
51             printf("\n");
52         }
53     return 0;
54 }

 

posted @ 2016-03-25 16:45  OhYee  阅读(143)  评论(0编辑  收藏  举报