问题 I: 画正方形

52 篇文章 0 订阅

问题 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值