问题 I: 画正方形
时间限制: 1 Sec 内存限制: 128 MB提交: 15 解决: 5
[ 提交][ 状态][ 讨论版]
题目描述
ADA是个特能折腾的小女孩,她的爸爸有时候想清净一点都不成。最近ADA迷上画图,她爸爸心生一计,让她去画一个正方形,正方形边长n为3的t次幂 1 <= t <= 7。
画图规则如下:
(1)第一个画的正方形其边以大写字母’A’填充,正方形里面不需要填充。
(2)如果规则一画的正方形边长大于3,则将其分成边长为n/3的9个小正方形,每个小正方形继续画图,如果画的地方如果已经存在字符,则保持不变。如果不存在字符,则一律以大写字母’B’填充。和规则二相同的地方是,只填充边,不填充里面部分。
(3)如果规则二得到的9个小正方形边长依然大于3,对这9个小正方形重复规则二的动作,只是填充字符一律使用’C ’, 这样能得到81个小正方形. 如果81个小正方形的边长依然不为3, 重复上面类似行为(注意填充字符变成下一个大写字母),直至剖分成的小正方形边长为3.
这个问题对ADA来说显然太难了,但是我想你行的,试一试吧.
输入
第一行是一个整数T,表示有多少组数据。
随后有T行,每一行包括一个整数n,代表刚开始画的正方形边长.
输出
每个整数n对应一个正方形输出,正方形中空的位置用空格符号.如果有多组测试数据,相邻两组之间有一空行隔开,注意最后一组后面不要有空行.
样例输入
2 3 27
样例输出
AAA A A AAA AAAAAAAAAAAAAAAAAAAAAAAAAAA A CC CC BB CC CC BB CC CC A ACCCCCCCBBCCCCCCCBBCCCCCCCA ACCCCCCCBBCCCCCCCBBCCCCCCCA A CC CC BB CC CC BB CC CC A ACCCCCCCBBCCCCCCCBBCCCCCCCA ACCCCCCCBBCCCCCCCBBCCCCCCCA A CC CC BB CC CC BB CC CC A ABBBBBBBBBBBBBBBBBBBBBBBBBA ABBBBBBBBBBBBBBBBBBBBBBBBBA A CC CC BB CC CC BB CC CC A ACCCCCCCBBCCCCCCCBBCCCCCCCA ACCCCCCCBBCCCCCCCBBCCCCCCCA A CC CC BB CC CC BB CC CC A ACCCCCCCBBCCCCCCCBBCCCCCCCA ACCCCCCCBBCCCCCCCBBCCCCCCCA A CC CC BB CC CC BB CC CC A ABBBBBBBBBBBBBBBBBBBBBBBBBA ABBBBBBBBBBBBBBBBBBBBBBBBBA A CC CC BB CC CC BB CC CC A ACCCCCCCBBCCCCCCCBBCCCCCCCA ACCCCCCCBBCCCCCCCBBCCCCCCCA A CC CC BB CC CC BB CC CC A ACCCCCCCBBCCCCCCCBBCCCCCCCA ACCCCCCCBBCCCCCCCBBCCCCCCCA A CC CC BB CC CC BB CC CC A AAAAAAAAAAAAAAAAAAAAAAAAAAA
提示
#include<iostream>
using namespace std;
int main()
{
int t,c=0;
cin>>t;
while(t--){
int i,j;
char map[3002][3002];
for(i=0;i<3002;i++)
for(j=0;j<3002;j++)
map[i][j]='.';
int n;
cin>>n;
int edge=n,count=0;
while(edge>=3){ int flag=0;
for(i=1;i<=n;i=i+edge-1)
{
for(j=1;j<=n;j++)
{
if(map[i][j]=='.'||map[i][j]==('A'+count))
{
flag=1;
map[i][j]='A'+count;
map[j][i]='A'+count;
if(count>0)
{
map[i+1][j]='A'+count;
map[j][i+1]='A'+count;
}
}
}
if(flag&&count>0)
i++;
}
count++;
edge=edge/3;
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
if(map[i][j]=='.')
cout<<" ";
else
cout<<map[i][j];
cout<<endl;
}
if(t!=0)
cout<<endl;
}
return 0;
}