原题链接:DNA
解题思路:
1.对每一组输入的a, b ,确定 行(row) 和 列(等于a的值) 后,遍历每一个位置,若处于对角线(主、副 对角线),则打印X,否则打印空格; 2.观察原图形(譬如 a=5, b=4),除去第一行,后面的(a-1)行 均重复 b 次,则需要打印的总行数 = (a-1) * b + 1 (此时需要把除去的第一行加回来); 3.对于列,每一个 小单位(未重复的部分) 按照正方形 打印,其列数 等于 a 。
注意事项:
1.在遍历前,需要设置 开始值begin (初值为1,因为每组输入后,第一个元素 就是X),以确定 打印完一行后 下一次开始 打印X 的位置 ; 2.在判断对角线时,j==begin 表示主对角线(从左上 到 右下),j==a + 1 - begin 表示副对角线(从右上 到 左下); 3.每打印完一行,begin 自增1(沿着 主对角线 向下),若越界(超过 列数a,即 等于a+1),则赋 初值2 (观察原图形,下一个小单位的开头 在2的位置); 4.每打印完一行,需要 puts("") 来换行; 5.每完成 一组输入 ,需要 puts("") 来换行。
参考代码:
#include<stdio.h> int main() { int n, a, b, row, begin; scanf("%d", &n); while(n --){ scanf("%d %d", &a, &b); row = (a - 1) * b + 1; begin = 1; for(int i = 1; i <= row; i ++){ for(int j = 1; j <= a; j ++) if(j == begin || j == a + 1 - begin) printf("X"); else printf(" "); if(++ begin == a + 1) begin = 2; puts(""); } puts(""); } return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复