C语言官网蓝桥杯训练1115DNA

这道题是比较简单的输出字符图形的题,但是有几个坑还是要注意下。

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

原文地址:https://www.cnblogs.com/cong12586/p/10544040.html