C语言训练:DNA

题目描述

小强从小就喜欢生命科学,他总是好奇花草鸟兽从哪里来的。终于, 小强上中学了,接触到了神圣的名词--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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值