• 圈圈 模拟图纸


    题目描述 

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

  • 相关阅读:
    Android Studio导入第三方类库的方法
    转:[Android Studio 权威教程]最实用的快捷键
    转[Android Studio 权威教程]配置出“NB”的Android Studio
    Android中对list的日期元素进行排序
    Unable to resolve target 'android-XX'
    Android WebView 获取网页的标题
    button设置点击更改背景图片 转
    android 跳转 系统浏览器的方法
    android学习笔记之调用拨号界面拨打电话
    自定义dialog无黑色边框
  • 原文地址:https://www.cnblogs.com/carcar/p/8335695.html
Copyright © 2020-2023  润新知