画圆圈

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

题目描述

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

输入描述:

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

输出描述:链接:https://www.nowcoder.com/acm/contest/67/G

来源:牛客网


听到对应数字时,输出对应样子的圆圈。
注意分割图形的位置,分界点
  
  
O
 O
O O
 O
    O
   O O
    O
 O     O
O O   O O
 O     O
    O
   O O
    O
             O
            O O
             O
          O     O
         O O   O O
          O     O
             O
            O O
             O
    O                 O
   O O               O O
    O                 O
 O     O           O     O
O O   O O         O O   O O
 O     O           O     O
    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后面不带空格。
#include<bits/stdc++.h>
using namespace std;
char mm[10000][100000];
void disp( int s, int x, int y)
{
     if (s==1)///分割到无法分割,
     {
 
         mm[x][y-1]= 'O' ;
         mm[x][y+1]= 'O' ;
         mm[x-1][y]= 'O' ;
         mm[x+1][y]= 'O' ;
         return ;
     }
     int t= pow (3,s-1);/// 图形以3*3为一个小区域分割
 //(x,y)为中心点上下左右进行分割,移动距离以最小区域为准
     disp(s-1,x,y-t);
     disp(s-1,x,y+t);
     disp(s-1,x+t,y);
     disp(s-1,x-t,y);
}
int main()
{
     int n,m,a,b,s;
     scanf ( "%d" ,&n);
     while (n--)
     {
         scanf ( "%d" ,&s);
 
         if (s==0)
         {
             puts ( "O" );
             continue ;
         }
         int p= pow (3,s);
         for ( int i=1; i<=p; i++)
 
             for ( int j=1; j<=p; j++)
 
                 mm[i][j]= ' ' ;
         disp(s,p/2+1,p/2+1);///图形的中间点
         int i,j,c,k;
         for ( i=1; i<=p; i++)
         {
             c=p;
             for ( k=p; k>=0; k--)
             {
                 if (mm[i][k]!= ' ' )
                 {
                         c=k;
                     break ;
                 }
             }
           
             for ( j=1; j<=c; j++)
                 printf ( "%c" ,mm[i][j]);
             puts ( "" );
         }
 
     }
     return 0;
}
 
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值