【问题描述】
题目描述
小强从小就喜欢生命科学,他总是好奇花草鸟兽从哪里来的。终于, 小强上中学了,接触到了神圣的名词--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; }
来源:https://www.cnblogs.com/jessie99/p/12641422.html