题目描述
小强从小就喜欢生命科学,他总是好奇花草鸟兽从哪里来的。终于, 小强上中学了,接触到了神圣的名词--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,小问题是输出DNA片段,那么我们就要先构造一个算法来输出DNA片段。以三行DNA片段和五行DNA片段为例来分析这题。
3行
X X X X X
5行
X X X X X X X X X
从图中我们可以明显看出DNA的片段是一个行列相同的矩阵,那么我们就需要一个二维数组来存放元素值,且二维数组的行列数是可以变化的。
我们先把二维数组中所有值都赋值为空,然后把主对角线和副对角线元素全部赋值为X,一个行数可以变化的DNA片段就完成了。
接下来我们要考虑重复度,以题目中5行重复度为4的DNA片段进行一次分析:
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片段露掉最后一行,重复输出露掉最后一行的DNA片段(重复度-1)次,最后再输出一个完整的DNA片段就往事了。
注意DNA的行数为奇数,题目中已经表明了范围到时候输出的时候需要判断一下。
#include <stdio.h>
#include <stdlib.h>
void fun(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]=' '; //二维数组所有值赋值为空
}
for(int j=i; j>=i; j--)
{
a[i][j]='X'; //主对角线所有制赋值为X
}
for(int k=n-1-i; k>=n-1-i; k--)
{
a[i][k]='X'; //副对角线所有值赋值为X
}
}
if(y==1) //如果重复度为1的话直接输出一个完整的DNA片段就行了
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
printf("%c",a[i][j]);
}
printf("\n");
}
}
else if(y>1) //如果重复度不为1的话,先输出(重复度-1)个不完整的DNA片段
{
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]);
}
printf("\n");
}
}
for(int i=0; i<n; i++) //最后再输出一个完整的DNA片段
{
for(int j=0; j<n; j++)
{
printf("%c",a[i][j]);
}
printf("\n");
}
}
}
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]);
}
for(int i=0;i<N;i++)
{
if(a[i]%2!=0&&a[i]>=3) //DNA片段只能为奇数
{
fun(a[i],b[i]);
}
printf("\n");
}
return 0;
}