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图形的输出,循环条件不太好控制。因此,这题可以考虑用递归来做。至于X和空白的地方,都可以存到一个二维数组里。下面来看代码:

 1 #include <stdio.h>
 2 #define N 100
 3 char ch[N][N];
 4 int main(void)
 5 { 
 6     void reDraw(int a,int b);
 7     int n,i,j,k=1;
 8     int a,b;
 9     scanf("%d",&n);
10     while(n--){
11         scanf("%d %d",&a,&b);
12         for(j = 1;j <= a;j++){  //先打印第一行,剩下的全部用递归来完成 
13             if(j == 1 || j == a){
14                 ch[1][j] = 'X';
15             }
16             else{
17                 ch[1][j] = ' ';
18             }
19         }
20         for(j = 1;j <= a;j++){
21             printf("%c",ch[1][j]);
22         }
23         printf("\n"); //这里记得打印换行符 
24         reDraw(a,b);
25         printf("\n"); //题目要求:每组输出间有一空行 
26     }
27     return 0;
28 }
29 
30 void reDraw(int a,int b)
31 {
32     if(b-- > 0){   //设置递归次数,即重复次数 
33         int i,j;
34         for(i = 2;i <= a;i++){
35             for(j = 1;j <= a;j++){
36                 if(i==j || i+j==a+1){
37                     ch[i][j] = 'X';
38                 }
39                 else{
40                     ch[i][j] = ' ';
41                 }
42             }
43         }
44         for(i = 2;i <= a;i++){
45             for(j = 1;j <= a;j++){
46                 printf("%c",ch[i][j]);
47             }
48             printf("\n");
49         }
50         reDraw(a,b);
51     }
52 }

运行效果:

 

posted @ 2021-01-31 13:44  EvanTheBoy  阅读(171)  评论(0)    收藏  举报