圆圈

/*
题目描述 
    圈圈圆圆圈圈,lulu小朋友最近看喜羊羊看多了,老是受刺激就画圆圈,听到小于8的数字时,还会画出十分有规律的圆圈,现在你需要根据样例观察出规律,编写程序,根据输入的数字n(n<8),输出对应的圆圈。
输入描述:
第一行是样例数T(T<9)
    第22+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;
*/

#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;

//搜索的方法
int len[8]={1,3,9,27,81,243,729,2187};
char a[2500][2500];
string s[2500];

void dfs(int i, int j, int n){
    if(n==0){
        a[i][j]='O';
        return ;
    }
    dfs(i, j+len[n-1], n-1);
    dfs(i+len[n-1], j, n-1);
    dfs(i+len[n-1], j+2*len[n-1], n-1);
    dfs(i+2*len[n-1], j+len[n-1], n-1);
}

int main()
{
    int t,n;
    int i,j;
    scanf("%d",&t);
    while(t--)
    {

        scanf("%d",&n); 
        for(i=0;i<len[n];i++){
            s[i]="";
            for(j=0;j<len[n];j++)
                a[i][j]=' ';
        }

        dfs(0, 0, n);

        for(i=0; i<len[n]; i++)
        {
            int cnt = len[n]-1;
            while(a[i][cnt]==' ')
                cnt--;
            for(j=0; j<=cnt; j++)
                s[i]+=a[i][j];
            cout<<s[i]<<endl;
        }
    }
    system("pause");
    return 0;
}

//递归的方法
/*
int getline(int n, int m){
    int dds;
    if(n==0){
        cout<<"O";
        return 0;
    }else{
        int ds=pow(3,n);
        if(m<=ds/3 || m>ds/3*2){//上下
            for(int i=1; i<=ds/3; i++){
                cout<<" ";
            }
            dds = getline(n-1, m%(ds/3))+ds/3;
        }else{
            dds = getline(n-1, m%(ds/3));
            for(int i=1; i<=ds/3; i++)
                cout<<" ";
            for(int i=1; i<=dds; i++)
                cout<<" ";
            getline(n-1, m%(ds/3));
        }
    }
    return dds;
}

int main(){
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        int num;
        num = pow(3,n); //三次方层
        for(int i=1; i<=num; i++){
            getline(n,i);   //对每一层输出
            cout<<endl;
        }
    }
    system("pause");
    return 0;
}
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值