题目描述
圈圈圆圆圈圈,lulu小朋友最近看喜羊羊看多了,老是受刺激就画圆圈,听到小于8的数字时,还会画出十分有规律的圆圈,现在你需要根据样例观察出规律,编写程序,根据输入的数字n(n<8),输出对应的圆圈。
输入描述
第一行是样例数T(T<9);
第2到2+T-1行每行有一个整数n(n<8),代表lulu听到的数字。
输出描述
听到对应数字时,输出对应样子的圆圈。
示例输入
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;
题解
可以发现,每个图形若补齐空格,都是边长为pow(3,n)的正方形。而所有的图形(除了0)可以横等三纵等三分为如图九块。
观察可见,奇数区域均为空白,偶数区域均为(n-1)图形。再次观察数据发现数据范围很小,于是可以在数组中通过递归绘制图形,再打印数组。
#include<stdio.h>
#include<math.h>
#include<string.h>
char p[3000][3000];
int ed[3000];
void print(int n,int sx,int sy)
{
if(n==0)
{
p[sx][sy]=1;
return;
}
int part=(int)pow(3,n-1);
print(n-1,sx+part,sy);
print(n-1,sx,sy+part);
print(n-1,sx+part,sy+2*part);
print(n-1,sx+2*part,sy+part);
}
int main()
{
int t,n,alls;
scanf("%d",&t);
while(t--)
{
memset(p,0,sizeof(p));
scanf("%d",&n);
alls=pow(3,n);
print(n,0,0);
for(int i=0;i<alls;i++)
for(int j=0;j<alls;j++)
if(p[i][j]) ed[i]=j;
for(int i=0;i<alls;i++)
{
for(int j=0;j<=ed[i];j++)
{
if(p[i][j]) printf("O");
else printf(" ");
}
printf("\n");
}
}
return 0;
}