【算法】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
 #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;
 }

 

posted @ 2020-04-06 11:58  美好事物  阅读(37)  评论(0编辑  收藏