2018年全国多校算法寒假训练营练习比赛(第一场) G.圆圈(分形几何)

题目描述

圈圈圆圆圈圈,lulu小朋友最近看喜羊羊看多了,老是受刺激就画圆圈,听到小于8的数字时,还会画出十分有规律的圆圈,现在你需要根据样例观察出规律,编写程序,根据输入的数字n(n<8),输出对应的圆圈。


输入描述

第一行是样例数T(T<9);

第2到2+T-1行每行有一个整数n(n<8),代表lulu听到的数字。


输出描述

听到对应数字时,输出对应样子的圆圈。


示例输入

4

0

1

2

3


示例输出

O

 O

O O

 O

    O

   O O

    O

 O     O

O O   O O

 O     O

    O

   O O

    O

             O

            O O

             O

          O     O

         O O   O O

          O     O

             O

            O O

             O

    O                 O

   O O               O O

    O                 O

 O     O           O     O

O O   O O         O O   O O

 O     O           O     O

    O                 O

   O O               O O

    O                 O

             O

            O O

             O

          O     O

         O O   O O

          O     O

             O

            O O

             O


说明

当n=0时输出
O

当n=1时输出
*O

O*O

*O

当n=2时输出
****O
***O*O
****O
*O*****O
O*O***O*O
*O*****O
****O
***O*O
****O
上面的'O'是大写英文字母O,'*'代表空格,每一行最后一个O后面不带空格。

备注

对于100%的数据,0<T<9;0<=n<8;


题解

可以发现,每个图形若补齐空格,都是边长为pow(3,n)的正方形。而所有的图形(除了0)可以横等三纵等三分为如图九块。

观察可见,奇数区域均为空白,偶数区域均为(n-1)图形。再次观察数据发现数据范围很小,于是可以在数组中通过递归绘制图形,再打印数组。

#include<stdio.h>
#include<math.h>
#include<string.h>
char p[3000][3000];
int ed[3000];
void print(int n,int sx,int sy)
{
    if(n==0)
    {
        p[sx][sy]=1;
        return;
    }
    int part=(int)pow(3,n-1);
    print(n-1,sx+part,sy);
    print(n-1,sx,sy+part);
    print(n-1,sx+part,sy+2*part);
    print(n-1,sx+2*part,sy+part);
}
int main()
{
    int t,n,alls;
    scanf("%d",&t);
    while(t--)
    {
        memset(p,0,sizeof(p));
        scanf("%d",&n);
        
        alls=pow(3,n);
        print(n,0,0);
        
        for(int i=0;i<alls;i++)
        for(int j=0;j<alls;j++)
        if(p[i][j]) ed[i]=j;
  
        for(int i=0;i<alls;i++)
        {
            for(int j=0;j<=ed[i];j++)
            {
                if(p[i][j]) printf("O");
                else printf(" ");
            }
            printf("\n");
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值