1.1233-XTUOJ
题目描述
给定N,输出一个N*N的矩阵,矩阵为N层,每层是一个字符,从A到Z。 比如说N=3,矩阵为
CCCCC
CBBBC
CBABC
CBBBC
CCCCC
输入
第一行是一个整数K(K≤50),表示样例数。 每个样例占1行,为一个整数N(1≤N≤26)。
输出
每个样例输出对应的矩阵,行尾没有多余的空格。
样例输入
3
1
2
3
样例输出
A
BBB
BAB
BBB
CCCCC
CBBBC
CBABC
CBBBC
CCCCC
考点:字符串的处理。
易错:memset初始化的注意事项,string类型和char类型不兼容。
分析:
题干比较难理解,乍一看可能会觉得题目出错了。给大家介绍一个比较好的理解题意的方法。当题干模糊不清的时候,多给题目增加条件,有助于题意的理解。
现在个大家阐述一下题意,内层为第一层,越往外,层数就越大,这就是题目层数的含义。
在左上、右上、左下、右下设置四个指针,逐层递减赋值即可。
需要注意的是,如果用String类型,那么不要用char类型给string类型(如string a ;a[i])赋值,否则会出现类型不兼容的问题,但是不会报错。
memset初始化适用于-1、0,‘\0’等,但是不能初始化为10等其他整数,因为memset是按照字节赋值的,详见memset的原理。
AC代码如下:
#include<stdio.h>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAX 100
char Alph[MAX][MAX];
void Draw_line(int a,int b,int c,char str_rec)
{
for(int j=b; j<=c; j++) Alph[a][j]=str_rec;
}
void Draw_row(int a,int b,int c,char str_rec)
{
for(int i=b; i<=c; i++) Alph[i][a]=str_rec;
}
struct
{
int x,y;
} point[4];
int main()
{
int K,N;
scanf("%d",&K);
while(K--)
{
scanf("%d",&N);
char alphbert=N+64;//memset的初始化
int X=2*N-1;//5
memset(Alph,'\0',sizeof(Alph));
//for(int i=0; i<X; i++)
//for(int j=0; j<X; j++) Alph[i][j]='\0';
point[0].x=0;
point[0].y=0;
point[1].x=0;
point[1].y=X-1;
point[2].x=X-1;
point[2].y=0;
point[3].x=X-1;
point[3].y=X-1;
while(N>=1)
{
Draw_line(point[0].x,point[0].y,point[1].y,alphbert);
Draw_line(point[2].x,point[2].y,point[3].y,alphbert);
Draw_row(point[0].y,point[0].x,point[2].x,alphbert);
Draw_row(point[1].y,point[1].x,point[3].x,alphbert);
N--;
alphbert=N+64;
point[0].x++;
point[0].y++;
point[1].x++;
point[1].y--;
point[2].x--;
point[2].y++;
point[3].x--;
point[3].y--;
}
for(int i=0; i<X; i++)
{
for(int j=0; j<X; j++) printf("%c",Alph[i][j]);
printf("\n");
}
}
return 0;
}