解题思路:

利用字符数组来实现空格和X的的变换,其次找到打印规律。

注意事项:

注意一:题目输出的是X,而不是x,晃眼一看很容易写成小写,这样很不容易发现错误。


注意二:输入包含多组测试数据。第一个整数N(N<=15),N表示组数,每组数据包含两个整数a,b。这里说的多组数据并不是有多组N,a,b的意思,而是说多组数据是由N控制,它决定组数,没有多组的N,否则就会输出超限


注意三:单纯的输出一个完整的DNA形状较为简单,多个重复我们就需要找规律(这是题目的关键)我的发现如下图

QQ图片20210209180804.png

通过图示我们可以知道,每一组数据需要一个循环(S1)来走重复打印的次数,在S1内部我们需要一个循环S2来实现每一个S1所打印的行数,在S2中我们需要一个循环S3来实现每一行字符数组的打印,就是3重循环。


代码部分我们做的是最后单独打印最后一行。

参考代码:

#include<stdio.h>
int main()
{
    int N,a,b,j,k,i;
    scanf("%d",&N);
 char ch[40];//将字符数组全部初始化为空格,在需要打印哪一行时将对应的部分改为X,打印完成,又换回空格
 for(i=0;i<40;i++)
 ch[i]=' ';
 while(N--)//当全部组数打印完,跳出循环
 {
    scanf("%d %d",&a,&b);
    for(i=0;i<b;i++)//循环S1
    {
       for(k=0;k<a-1;k++)//循环S2
       {
         ch[k]=ch[a-k-1]='X';
         for(j=0;j<a;j++)循环S3
         printf("%c",ch[j]);
         printf("\n");
         ch[k]=ch[a-k-1]=' ';
       } 
   }
    ch[0]=ch[a-1]='X';//单独打印剩的那一行
    for(j=0;j<a;j++)
    printf("%c",ch[j]);
    printf("\n\n");
    ch[0]=ch[a-1]=' ';
   }
    return 0;
}

有问题的同学欢迎讨论,我们互相成长,一起变强!

点赞(0)
 

0.0分

24 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 22 条评论

Sion258 2年前 回复TA
能说说最后一步是干什么的吗 ch[0]=ch[a-1]=' ';
小姜骑猪 2年前 回复TA
@小姜骑猪 #include<stdio.h>  int main() { 	char a[10][10]; 	int n, k[15]={0}, m[15]={0}; 	int i, j, w,q; 	scanf("%d",&n); 	for (i = 0; i <n; i++) 		scanf("%d%d",&k[i], &m[i]); 	for (q = 0; q < n; q++) 	{  		for (i = 0; i < k[0+q]; i++) 		{ 			for (j = 0; j < k[0+q]; j++) 			{ 				if (j == i || j == k[0+q] - 1 - i) 					a[i][j] = &#039;X&#039;; 				else 					a[i][j] =&#039; &#039;; 			} 		} 		int l = 0; 		for (w = 0; w < m[0+q]; w++) 		{ 		 			{ 				for (i = 0 + l; i < k[0 + q]; i++) 				{ 					for (j = 0; j < k[0 + q]; j++) 					{ 						printf("%c", a[i][j]); 					} 					printf("
"); 				} 			} 			l = 1; 		} 		printf("
"); 	} 	return 0; }
小姜骑猪 2年前 回复TA
#include<stdio.h>

int main()
{
	char a[10][10];
	int n, k[15]={0}, m[15]={0};
	int i, j, w,q;
	scanf("%d",&n);
	for (i = 0; i <n; i++)
		scanf("%d%d",&k[i], &m[i]);
	for (q = 0; q < n; q++)
	{

		for (i = 0; i < k[0+q]; i++)
		{
			for (j = 0; j < k[0+q]; j++)
			{
				if (j == i || j == k[0+q] - 1 - i)
					a[i][j] = 'X';
				else
					a[i][j] = ' ';
			}
		}
		for (w = 0; w < m[0+q]; w++)
		{
			for (i = 0; i < k[0+q]; i++)
			{
				for (j = 0; j < k[0+q]; j++)
				{
					printf("%c", a[i][j]);
				}
				printf("\n");
			}
		}
		printf("\n");
	}
	return 0;
}
结果一样,为什么不对
1021王俊峰 2年前 回复TA
@lyhyao68 如果是循环打印的话,有一行是多余的,不是最后一行就是第一行
lyhyao68 2年前 回复TA
为什么不能从头开始循环,需要单独打印第一行
Yeah 2年前 回复TA
#include<bits/stdc++.h>
using namespace std;
void p(int a,int b)//打印 一组dna要求 =核心重复+增加一行
{
    for(int k=1;k<=b;k++)//多组打印
    {
    int c=1,d=a;
    for(int j=1;j<=a-1;j++)
        {
                for(int i=1;i<=a;i++)//打印一行
            {
                if(i==c||i==d)
                cout<<"X";
                else
                cout<<" ";
            }
            cout<<endl;//打印完成一行后换行
            c++;
            d--;
        }
    }
    //尾部附加
    for(int i=1;i<=a;i++)
    if(i==1||i==a)
    cout<<"X";
    else
    cout<<" ";
    cout<<endl;//写完一组完整数据后要换行!
    cout<<endl;
    
    
}
树脂螺丝拧不花 3年前 回复TA
#include<stdio.h>
int main()
{
    int i,j,n;
    int s,d;
    int a[20],b[20];
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d%d",&a[i],&b[i]);
    }
    for(i=0;i<n;i++)
    {
    	//打印第一行 
        for(j=0;j<a[i];j++)
        {
            if(j==0||j==a[i]-1)
             printf("X");
            else
            printf(" ");
        }
        printf("\n");
        //打印每个DNA循环部分 
        for(j=0;j<b[i];j++)
        { 
            for(d=1;d<=a[i]-1;d++)//行数 
            {
                for(s=1;s<=a[i];s++)//列数 
                {
                   if(s==d+1||s==a[i]-d)
新城已无旧少年 3年前 回复TA
#include<stdio.h>
#define N 100
void f(int a,int b)
{
	int m=0;
	char P[N][N];
	for(int i=0;i<a;i++)       //1和b// 
	{
		for(int j=0;j<a;j++)
		{
			if(i==j||i+j==a-1)
			{
			    P[i][j]='X';	
			}else{
				P[i][j]=' ';
			}
		}
	}
	int flag=b;
	while(flag--)
	{
		if(flag==b-1)
		{
			for(int k=0;k<a;k++)
			{
				puts(P[k]);
			}
		}else{
			for(int l=1;l<a;l++)
			{
				puts(P[l]);
			}
		}
	}
}
int main()
{
	int n,a,b;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d%d",&a,&b);
		f(a,b);
		printf("\n");
	}
	return 0;
}
自律给我自由 3年前 回复TA
@自律给我自由 哦哦,是的是的
light 3年前 回复TA
@自律给我自由 读题啊