题目描述
圈圈圆圆圈圈,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