AOJ 716.谢尔宾斯基三角形
Time Limit: 3000 ms Case Time Limit: 3000 ms Memory Limit: 128 MB
Total Submission: 116 Submission Accepted: 35Description谢尔宾斯基三角形(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 }
然而,我并不能保证我说的是对的。请自行验证,如有错误,请指正
新博客地址
https://www.oyohyee.com
https://www.oyohyee.com