圈圈 模拟图纸

题目描述 

    圈圈圆圆圈圈,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;

这道题目想了很久还是没有思路,但看了一位大佬写的代码,终于明白了这道题的写法
这道题没有所谓的算法,但是他的想法却令人称奇:

先初始化第一个圆
第二个圆,将第一个圆挪动一些位置,印在第二张图上,印四下,得到第二个圆
以后的圆根据前一个圆得到

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stdbool.h>
 4 bool f[8][3000][3000];//为图纸,1代表画o
 5 int a[8],g[8][2500];//a记录图纸的大小,g[a][b]指第a张图纸第b行有多少个元素
 6 void fill(int n,int x,int y)//xy为偏移量,给第n个图纸画
 7 {
 8      int i,j;
 9      for(i=1;i<=a[n-1];i++)
10      {
11         for(j=1;j<=a[n-1];j++)
12           if(f[n-1][i][j])f[n][i+y][j+x]=1;
13         if(g[n][i+y]<g[n-1][i]+x)
14             g[n][i+y]=g[n-1][i]+x;
15      }
16 }
17 int main()
18 {
19     int i,w,n,j,k;//先初始化化第一张图纸
20     f[0][1][1]=1;
21     a[0]=1;a[1]=3;
22     g[0][1]=1;
23     for(i=1;i<8;i++)//画好所有图纸
24     {
25         a[i]=a[i-1]*3;
26         fill(i,a[i-1],0);
27         fill(i,0,a[i-1]);
28         fill(i,2*a[i-1],a[i-1]);
29         fill(i,a[i-1],2*a[i-1]);
30     }
31     while(scanf("%d",&n)==1)
32     {
33         for(k=0;k<n;k++)
34         {
35             scanf("%d",&w);
36             for(i=1;i<=a[w];i++)
37             {
38                 for(j=1;j<=g[w][i];j++)
39                     if(f[w][i][j])printf("O");
40                      else printf(" ");
41                  puts("");
42             }
43         }
44     }
45 }
递归解法http://blog.csdn.net/hopygreat/article/details/79132472

原文地址:https://www.cnblogs.com/carcar/p/8335695.html