肖黄清


私信TA

用户名:uq_24402228243

访问量:3076

签 名:

等  级
排  名 5197
经  验 1492
参赛次数 0
文章发表 13
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:

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 人评分

  评论区