TheSierpinskiFractal(POJ-1941)【递推】

题意:用‘\’,'/','_'按照给定规则画出三角形

题目链接:https://vjudge.net/problem/POJ-1941

思路:题中的三角形生成规则是符合递推关系的,可以先手动完成第一个三角形,再根据题中规律逐级递推,推出每个三角形的图案,需要的时候直接查询即可。

  😥比赛的时候错误计算了数组需要的空间数量。所需列数最大值为4*2^n。

  注:输出时不能用%C,会超时,除此之外,每一行行末多余的空格也时不能输出同时也没必要输出的,因此需要处理图案时在行末手动加上‘\0',再以%s输出。

代码如下:

 1 #include<cstdio>
 2 
 3 using namespace std;
 4 struct ha{
 5     int a,h;
 6     char mp[1050][2060];
 7 }aha[11];
 8 int main(){
 9     aha[1].a=4;aha[1].h=2;
10     aha[1].mp[0][0]=' ';
11     aha[1].mp[0][1]='/';
12     aha[1].mp[0][2]='\\';
13     aha[1].mp[0][3]='\0';
14     aha[1].mp[1][0]='/';//__\\";
15     aha[1].mp[1][1]=aha[1].mp[1][2]='_';
16     aha[1].mp[1][3]='\\';
17     aha[1].mp[1][4]='\0';
18     for(int ii=2;ii<=10;ii++){
19         aha[ii].a=aha[ii-1].a*2;
20         aha[ii].h=aha[ii-1].h*2;
21         for(int i=0;i<aha[ii-1].h;i++){
22             for(int j=0;j<aha[ii-1].a/2;j++)
23                 aha[ii].mp[i][j]=' ';
24             for(int j=aha[ii-1].a/2;j<aha[ii-1].a/2+aha[ii-1].a;j++){
25                 char ch=aha[ii-1].mp[i][j-aha[ii-1].a/2];
26                 aha[ii].mp[i][j]=aha[ii-1].mp[i][j-aha[ii-1].a/2];
27                 if(ch=='\0')
28                     aha[ii].mp[i][j]=' ';
29             }   
30         }
31         for(int i=aha[ii-1].h;i<aha[ii-1].h*2;i++){
32             for(int j=0;j<aha[ii-1].a;j++){
33                 char ch=aha[ii-1].mp[i-aha[ii-1].h][j];
34                 aha[ii].mp[i][j]=aha[ii-1].mp[i-aha[ii-1].h][j];
35                 if(ch=='\0')
36                     aha[ii].mp[i][j]=' ';
37             }
38         }
39         for(int i=aha[ii-1].h;i<aha[ii-1].h*2;i++){
40             for(int j=aha[ii-1].a;j<aha[ii-1].a*2;j++){
41                 char ch=aha[ii-1].mp[i-aha[ii-1].h][j-aha[ii-1].a];
42                 aha[ii].mp[i][j]=aha[ii-1].mp[i-aha[ii-1].h][j-aha[ii-1].a];
43                 if(ch=='\0')    
44                     aha[ii].mp[i][j]=' ';
45             }
46         }
47         int x=aha[ii-1].a+1;
48         for(int i=0;i<aha[ii].h;i++){
49             aha[ii].mp[i][x++]='\0';
50         }
51     }
52     int n;
53     while(scanf("%d",&n)&&n!=0){
54         for(int i=0;i<aha[n].h;i++){
55                 printf("%s",aha[n].mp[i]);
56             printf("\n");
57         }
58         printf("\n");
59     }
60     return 0;
61 }

 

posted @ 2019-10-06 09:48  xxmlala  阅读(274)  评论(1编辑  收藏  举报