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


    链接:https://www.nowcoder.com/acm/contest/67/G
    来源:牛客网

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

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

    输入描述:

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

    输出描述:

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

    输入

    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;

    分析:递归。跟poj1941差不多.

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    char s[2189][2189];
    void draw(int i,int j,int n)//从(i,j)开始画o 
    {
        if(n==1)
        {
            s[i][j]='O';
            s[i+1][j-1]='O';
            s[i+1][j+1]='O';
            s[i+2][j]='O';
        }
        else
        {
            int dis=(int)pow(3.0,n-1);
            draw(i,j,n-1);
            draw(i+dis,j+dis,n-1);
            draw(i+dis,j-dis,n-1);
            draw(i+dis*2,j,n-1);
        }
    }
    
    int main()
    {
        int T,N;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&N);
            if(N==0) {printf("O
    ");continue;}
            for(int i=0;i<2189;i++)
            memset(s[i],' ',sizeof(s[i]));
            int dis=(int)pow(3.0,N);
            draw(1-1,(dis+1)/2-1,N);
            for(int i=0;i<=dis-1;i++)
            {
                int j=dis-1;
                while(true)
                {
                    if(s[i][j]=='O') break;
                    j--;
                }
                s[i][j+1]='';
                puts(s[i]);
            }
        }
        return 0;
    }
    View Code








  • 相关阅读:
    sign in和sign up区别
    sql语句左右表连接理解
    神器
    js不能执行的几个小白错误
    关于isset使用产生Can't use function return value in write context错误
    jQuery中怎么添加innerText、innerHtml(转)
    C#开发BHO程序(引)
    C# 开发BHO插件
    JS对日期时间的操作
    解决JQuery中datatables设置隐藏显示列多次提交后台刷新数据的问题
  • 原文地址:https://www.cnblogs.com/ACRykl/p/8325582.html
Copyright © 2020-2023  润新知