/*
题目描述
圈圈圆圆圈圈,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;
*/
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
//搜索的方法
int len[8]={1,3,9,27,81,243,729,2187};
char a[2500][2500];
string s[2500];
void dfs(int i, int j, int n){
if(n==0){
a[i][j]='O';
return ;
}
dfs(i, j+len[n-1], n-1);
dfs(i+len[n-1], j, n-1);
dfs(i+len[n-1], j+2*len[n-1], n-1);
dfs(i+2*len[n-1], j+len[n-1], n-1);
}
int main()
{
int t,n;
int i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<len[n];i++){
s[i]="";
for(j=0;j<len[n];j++)
a[i][j]=' ';
}
dfs(0, 0, n);
for(i=0; i<len[n]; i++)
{
int cnt = len[n]-1;
while(a[i][cnt]==' ')
cnt--;
for(j=0; j<=cnt; j++)
s[i]+=a[i][j];
cout<<s[i]<<endl;
}
}
system("pause");
return 0;
}
//递归的方法
/*
int getline(int n, int m){
int dds;
if(n==0){
cout<<"O";
return 0;
}else{
int ds=pow(3,n);
if(m<=ds/3 || m>ds/3*2){//上下
for(int i=1; i<=ds/3; i++){
cout<<" ";
}
dds = getline(n-1, m%(ds/3))+ds/3;
}else{
dds = getline(n-1, m%(ds/3));
for(int i=1; i<=ds/3; i++)
cout<<" ";
for(int i=1; i<=dds; i++)
cout<<" ";
getline(n-1, m%(ds/3));
}
}
return dds;
}
int main(){
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
int num;
num = pow(3,n); //三次方层
for(int i=1; i<=num; i++){
getline(n,i); //对每一层输出
cout<<endl;
}
}
system("pause");
return 0;
}
*/
圆圈
最新推荐文章于 2023-04-20 19:14:13 发布