#include <stdio.h>
//要能够把图形抽象成一个数组,即矩阵
//本题本质上打印dna链,就是矩阵的多次输出,*所以只需写一个打印矩阵的函数,**同时也便于多组数据多次调用多次输出,易知,一个‘X'形矩阵是一个方阵
//空格不代表没有,而是一个值为‘空格’的矩阵元素
void printfdna(int n,int y)
{
char a[n][n];
for(int i=0; i<n; i++)
{
for(int m=0; m<n; m++)
{
a[i][m]=' ';
}
//初始化矩阵第i行
for(int j=i; j==i; j--)
{
a[i][j]='X';
}
//对于每个i值只循环(执行)一次,当for(int i=0; i<n; i++)循环完时,使得主对角线上元素全为‘X’
for(int k=n-1-i; k==n-1-i; k--)
{
a[i][k]='X';
}
//因为数组元素名是从[0--(n-1)]所以n要先-1再-i
//对于每个i值只循环(执行)一次,当for(int i=0; i<n; i++)循环完时,使得副对角线上元素全为‘X’
}
//初始化‘X’形矩阵
if(y==1)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
printf("%c",a[i][j]);
}
printf("\n");
}
}
// 因为当y!=1时,两个‘X’形矩阵链接时,会共用第一个矩阵的第n行(最后一行)
else if(y>1)
{
for(int k=1; k<y; k++)
{
for(int i=0; i<n-1; i++)
{
for(int j=0; j<n; j++)
{
printf("%c",a[i][j]);
}
//j<n,即每一行的元素正常打印
printf("\n");
}
//i<n-1,即每个‘X‘形矩阵的最后一行不打印,设为’X.‘
}
//k<y,即打印y-1次‘X.‘
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
printf("%c",a[i][j]);
}
printf("\n");
}
}
//打印最后一个正常的’X‘矩阵,即完成’dna‘链的打印
///也可以先单独打印一次第一行,然后打印y个‘.X‘,(即每个‘X‘形矩阵的第一行不打印,设为’.X‘)
///如下
// else if(y>1)
// {
// for(int j=0; j<n; j++)
// {
// printf("%c",a[0][j]);
// }
// printf("\n");
// ///***重要!
// ///*
// ///如果使用 printf("%s",a[0]); 来输出第一行,必须知道的是,
// ///以%s输出字符串,只在检测到数组的默认结尾符'\0'时停止输出,当把给定数组全部赋值时,没有位置,则不会自动添加'\0',此时只能用「for循环和%c」一个一个字符打印
// ///如果还想使用%s输出就需要在数组设置上扩大一个位置,数组会默认把最后一个空位置赋上'\0',即可正常输出
// ///即作如下修改即可,char a[n][n+1],还是只对一维数组的前n个元素处理,因此一维数组就会都空出一个位置使其赋值'\0'
// ///*
// //先打印一次第一行元素
// for(int k=1; k<=y; k++)
// {
// for(int i=1; i<n; i++)
// {
// for(int j=0; j<n; j++)
// {
// printf("%c",a[i][j]);
// }
// //j<n,即每一行的元素正常打印
// printf("\n");
// }
// //i<n-1,即每个‘X‘形矩阵的第一行不打印,设为’.X‘
// }
// //k<=y,即打印y次‘.X‘
// }
}
int main()
{
int n;
scanf("%d",&n);
int a[100],b[100];
for(int i=0; i<n; i++)
{
scanf("%d %d",&a[i],&b[i]);
}
//***重要:这样就可以保存多组数据了,不需要用二维数组,只需要把两个一维数组”联系“起来,如a[i],b[i]就是第i组数据
for(int i=0;i<n;i++)
{
if(a[i]%2!=0&&a[i]>=3)
{
printfdna(a[i],b[i]);
}
//简单判断一下,给的数必要是大于等于3的奇数
printf("\n");
}
return 0;
}
#include<stdio.h>
int main()
{
int n,a[100],b[100],i;
void printfdna(int ,int);
scanf("%d",&n);
//输入数据组数
for(i=0;i<n;i++)
//相当于 for(i=n;i>0;i--) || 注意区分 for(i=n;i>0;--i)
//**即注意区分i--和--i,i--是先赋值i进行判断后自减,所以执行n次循环 || --i是先自减再进行判断,所以执行n-1次循环
{
scanf("%d %d",&a[i],&b[i]);
}
for (i=0;i<n;i++)
{
printfdna(a[i],b[i]);
}
}
void printfdna(int a,int b)
{
int i,j,k;
for(i=0;i<a;i++)
//第一行打印a个字符,从0-(a-1),相当于从1-a
{
if (i==0||i==a-1)
{
putchar('X');
}
else
{
putchar(' ');
}
}
//完成第一行的打印
for(k=0;k<b;k++)
//打印b个相同图形,即少了第一行的‘X‘
{
for(i=1;i<a;i++)
//从第2行开始打印
{
putchar('\n');
//先将光标换行
for(j=0;j<a;j++)
{
if(i==j||i+j==a-1)
//**本质上构建一个矩阵(下y坐标系),对应在矩阵中的每个元素都有唯一下标(坐标),(PS:好家伙这下真线性代数了,doge)
//**构建判断(x+y=K(函数)(或叫方程也合适)),分析矩阵图形特征,显然主副对角线均为‘X’
//***重要!培养一个大的框架观,不要找元素间的关系,而是这些元素在大的框架上的共同之处,便于表达
//所以有,方程1(主对角线好想):x=y(即a11-ann),方程2(写几个坐标就找到规律了,显然坐标的x+y是定值):x+y=a-1(即a51,a42,a33)
//**对每个元素按序逐个判断,当坐标符合时,即在对应坐标位置打印'X',不符合则打印‘ ’
{
putchar('X');
}
else
{
putchar(' ');
}
}
}
}
putchar('\n');
//执行完一组换行
putchar('\n');
}
//**不要设置全局变量!!!!不然会造成不必要的循环意外结束或无限循环!!纯2b
两种解法