链接: https://www.nowcoder.com/acm/contest/67/G
来源:牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
圈圈圆圆圈圈,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;
题解:发现规律用递归来解决。
#include <bits/stdc++.h>
using namespace std;
char a[3000][3000];
void dfs(int c,int x,int y)
{
if(c==1)
{
a[x][y]='O';
return;
}
int k=pow(3,c-2);
dfs(c-1,x,y+k);
dfs(c-1,x+k,y);
dfs(c-1,x+k,y+2*k);
dfs(c-1,x+2*k,y+k);
}
int main()
{
int n;
cin>>n;
while(n--)
{
int m;
memset(a,' ',sizeof(a));
cin>>m;
dfs(m+1,1,1);
int s=pow(3,m);
for(int i=1;i<=s;i++)
{
for(int j=s;j>=1;j--)
{
if(a[i][j]=='O')
{
a[i][j+1]='\0';
break;
}
}
}
for(int i=1;i<=s;i++)
printf("%s\n",a[i]+1);
}
return 0;
}