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

Posted ACRykl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n");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]=\0;
            puts(s[i]);
        }
    }
    return 0;
}
View Code

 
















































以上是关于2018年全国多校算法寒假训练营练习比赛(第一场)G.圆圈的主要内容,如果未能解决你的问题,请参考以下文章

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

2018年全国多校算法寒假训练营练习比赛(第一场)E 恋与程序员

牛客网_2018年全国多校算法寒假训练营练习比赛(第一场)_部分题解

2018年全国多校算法寒假训练营练习比赛(第一场)D N阶汉诺塔变形

2018年全国多校算法寒假训练营练习比赛(第四场)

2018年全国多校算法寒假训练营练习比赛(第四场)