dotcpp.1115.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

首先观察,发现我们只需要打印第一行,接下来的循环输出即可.那么整个题目用代码实现的难点(?)就在于每一行要怎么打印,也就是发现数学上的规律.对此,我的处理是,在打印上半部分时,找到规律,打印下半部分时直接套上半部分的规律(要创建临时变量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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值