解题思路:
不难发现,看似复杂的DNA实际上是由第一个图形平移b-1次而成(b为重复度),再细化一下,整个DNA是由第一个图形中的所有‘x’(除了第一个图形左上和右上的‘x’,读者自行理解,不难理解)平移b-1次而成的,并且第一个图形中的任一‘x’与紧接着的图形中相同位置的‘x’相隔了a-1行(a的含义题目中已给出),和第n个图形中的相同位置的‘x’相隔了(n-1)*(a-1)行。
所以,我们只需要先确定第一个图形,剩下的图形可以利用第一个图形平移的原理即可。
注意事项:
参考代码:
#include <stdio.h>
#include <stdlib.h>
#define N 1000
int main()
{
int n;
int i,j;
int p;
int a[N],b[N];
int m;
char temp[N][N];
printf("Input n:\n");
scanf("%d",&n);
while(n<=0||n>15)
{
scanf("%d",&n);
}
printf("输入两个整数a,b(a为奇数且3<=a<=39。b表示重复度(1<=b<=20)):\n");
for(p=0;p<n;p++)
{
scanf("%d%d",&a[p],&b[p]);
while((a[p]%2==0)||(a[p]<3)||(a[p]>39)||(b[p]<1)||(b[p]>20))
{
printf("请重新输入合法数据:\n");
scanf("%d%d",&a[p],&b[p]);
}
}
for(p=0;p<n;p++)
{
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
temp[i][j]=' ';//先将数组全部初始化为空格
}
}
for(i=0;i<a[p];i++)
{
temp[i][i]='x';
temp[i][a[p]-i-1]='x';//确定第一个图形,‘x’在对角线上
}
for(m=1;m<=b[p];m++)//表示重复次数
{
for(i=1;i<a[p];i++)
{
for(j=0;j<a[p];j++)
{
if(temp[i][j]=='x')
{
temp[i+(a[p]-1)*m][j]='x';//利用平移原理,列数不变,行数相加,具体原理见解题思路
}
}
}
}
for(i=0;i<(a[p]*b[p]-b[p]+1);i++) // (a[p]*b[p]-b[p]+1) 为DNA总行数
{
for(j=0;j<a[p];j++)
{
printf("%c",temp[i][j]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复