【问题描述】
题目描述
小强从小就喜欢生命科学,他总是好奇花草鸟兽从哪里来的。终于, 小强上中学了,接触到了神圣的名词--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
【分析】
重点在于找到下标之间的关系
然后输出的时候注意重复那行需要控制输出
具体看代码
【代码】
//DNA
#include<stdio.h>
int main()
{
int N,i,j;
int ini;//记录每个重复度对应的起始位置
int b1;//记录从1到b的重复度
int a[15];
int b[15];
int n;//用来记录组数
char A[39*15][39*15];//用来保存输出的数组
scanf("%d",&N);
for(i=0; i<N; i++)
{
scanf("%d %d",&a[i],&b[i]);
}
n=0;
while(n<N)
{
b1=1;
while(b1<=b[n])
{
ini=a[n]*(b1-1)-b1+1;//每个重复度对应的起始位置
//循环起始位置到起始位置+a-1的位置,对需要输出X的位置进行赋值X,不需要的位置赋值' '
for(i=ini; i<=ini+a[n]-1; i++)
{
for(j=0; j<=a[n]-1; j++)
{
//满足条件的有两种情况,一种是正的对角线,一种是反的对角线,找其中的下标关系
if(i==j+ini || i+j==ini+a[n]-1)
{
A[i][j]='X';
}
else
{
A[i][j]=' ';
}
}
}
b1++;
}
//输出
b1=1;
while(b1<=b[n])
{
ini=a[n]*(b1-1)-b1+1;//每个重复度对应的起始位置
//在下一组之前先把数组输出来并且在不是最后一组的情况下+一个空行
if(b1!=b[n])//就不输出重复的一排
{
for(i=ini; i<ini+a[n]-1; i++)
{
for(j=0; j<=a[n]-1; j++)
{
//输出数组A
printf("%c",A[i][j]);
}
printf("\n");
}
}
//否则就需要输出重复的那一排
else
{
for(i=ini; i<=ini+a[n]-1; i++)
{
for(j=0; j<=a[n]-1; j++)
{
//输出数组A
printf("%c",A[i][j]);
}
printf("\n");
}
}
b1++;
}
//在不是最后一组的情况下输出空行
if(n<N-1)
{
printf("\n");
}
n++;
}
return 0;
}
来源:https://www.cnblogs.com/jessie99/p/12641422.html