牛客网 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听到的数字

输出描述:

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

输入

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;
题解:发现规律用递归来解决。

#include <bits/stdc++.h>
using namespace std;
char a[3000][3000];
 
void dfs(int c,int x,int y)
{
    if(c==1)
    {
        a[x][y]='O';
        return;
    }
    int k=pow(3,c-2);
    dfs(c-1,x,y+k);
    dfs(c-1,x+k,y);
    dfs(c-1,x+k,y+2*k);
    dfs(c-1,x+2*k,y+k);
}
 
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int m;
        memset(a,' ',sizeof(a));
        cin>>m;
        dfs(m+1,1,1);
        int s=pow(3,m);
        for(int i=1;i<=s;i++)
        {
        	for(int j=s;j>=1;j--)
        	{
        		if(a[i][j]=='O')
        		{
        			a[i][j+1]='\0';
        			break;
        		}
        	}
        }
        for(int i=1;i<=s;i++)
        printf("%s\n",a[i]+1);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40727946/article/details/79509707
今日推荐