题目描述
小强从小就喜欢生命科学,他总是好奇花草鸟兽从哪里来的。终于, 小强上中学了,接触到了神圣的名词--DNA.它有一个双螺旋的结构。这让一根筋的小强抓破头皮,“要是能画出来就好了” 小强喊道。现在就请你帮助他吧
输入格式
输入包含多组测试数据。第一个整数N(N<=15),N表示组数,每组数据包含两个整数a,b。a表示一个单位的DNA串的行数,a为奇数且 3<=a<=39。b表示重复度(1<=b<=20)。
输出格式
输出DNA的形状,每组输出间有一空行。
样例输入
复制
2 3 1 5 4
样例输出
复制
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
首先观察,发现我们只需要打印第一行,接下来的循环输出即可.那么整个题目用代码实现的难点(?)就在于每一行要怎么打印,也就是发现数学上的规律.对此,我的处理是,在打印上半部分时,找到规律,打印下半部分时直接套上半部分的规律(要创建临时变量m储存当前行数j而不能直接改变j ! 这里很关键)而最后一行无法直接套上半部分规律,拿出我们第一行打印的规律cv一下(注意控制循环的变量可能需要稍作变动)就可以了
我的正确代码如下:
#include <stdio.h>
int main()
{
int n, i;
scanf("%d", &n);
for(i=0; i<n; i++)
{
int a, b, j, k, p;
scanf("%d%d", &a, &b);
printf("X");
for(k=0; k<a-2; k++)
printf(" ");
printf("X\n");
for(k=0; k<b; k++)//有几组就循环几次这个图形
{
for(j=2; j<=a; j++)//这个图形一共有几行
{
if(j<a/2+1)
{
for(p=0; p<j-1; p++)
printf(" ");
printf("X");
for(p=0; p<a-2-2*(j-1); p++)
printf(" ");
printf("X\n");
}
else if(j == a/2+1)
{
for(p=0; p<a/2; p++)
printf(" ");
printf("X\n");
}
else if(j>a/2+1 && j != a)
{
int m = 2*(a/2+1)-j;
for(p=0; p<m-1; p++)
printf(" ");
printf("X");
for(p=0; p<a-2-2*(m-1); p++)
printf(" ");
printf("X\n");
}
else if(j == a)
{
printf("X");
for(p=0; p<a-2; p++)
printf(" ");
printf("X\n");
}
}
}
printf("\n");
}
return 0;
}