这道题是比较简单的输出字符图形的题,但是有几个坑还是要注意下。
1.题中所述的X是大写的,不要看成小写了。(我就错了好几次)
2.每一行输出最后的X后不能在输出空格。
3.输出两个DNA中间有一个空行。
解题思路:
只需要求出一个图形X的排列即可,后边直接重复输出,定义一个数组用来存放X,
注意观察图形,我们们可以知道,X所处的位置有两个情况
1.行列数相同
2.所处行数和列数相加等于总行数加一。
下边是代码:
#include<stdio.h>
int main()
{
int N;
scanf("%d",&N);//总的测试实例
while(N--)
{
int a,b,i,j,l;
scanf("%d %d",&a,&b);
char c[40][40];//定义字符串。
for(i=1;i<=a;i++)//a代表行列数,b代表重复次数
for(j=1;j<=a;j++)
{
if(i==j||i+j==a+1)//给字符串赋值 根据排列图中排列的规律
c[i][j]='X';
else
c[i][j]=' ';
}
for(i=1;i<=a;i++)//首先输出第一个完整的X排列
{
int flag=0;//用标志符号控制是否输出每一行的最后一个X,注意有一行只有一个X
for(j=1;j<=a;j++)
{
if(c[i][j]=='X')
{
printf("%c",c[i][j]);
flag++;
if(i!=(a+1)/2&&flag==2)//输出最后X后要退出,
break;
if(i==(a+1)/2&&flag==1)
break;
}
else
printf(" ");
}
printf("
");
}
for(l=2;l<=b;l++)//下边的输出为数组去掉第一行。
{
for(i=2;i<=a;i++)
{
int flag=0;
for(j=1;j<=a;j++)
{
if(c[i][j]=='X')
{
printf("%c",c[i][j]);
flag++;
if(i!=(a+1)/2&&flag==2)
break;
if(i==(a+1)/2&&flag==1)
break;
}
else
printf(" ");
}
printf("
");
}
}
printf("
");//最后输出结束后输出空行。
}
return 0;
}