✏️ 纠错
第 143 题 / 共 155 题
题目描述
小 A 想绘制一个菱形。具体来说,需要绘制的菱形是一个 n 行 n 列的字符画,n 是一个大于 1 的奇数。菱形的四个顶点依次位于第 1 行、第 1 列、第 n 行、第 n 列的正中间,使用 # 绘制。相邻顶点之间也用 # 连接。其余位置都是 .。
例如,一个 5 行 5 列的菱形字符画是这样的:
..#..
.#.#.
#...#
.#.#.
..#..
给定 n,请你帮小 A 绘制对应的菱形。
输入格式
一行,一个正整数 n。
输出格式
输出共 n 行,表示对应的菱形。
输入输出样例
输入 #1
3
输出 #1
.#. #.# .#.
输入 #2
9
输出 #2
....#.... ...#.#... ..#...#.. .#.....#. #.......# .#.....#. ..#...#.. ...#.#... ....#....
说明/提示
对于所有测试点,保证 3≤n≤29 并且 n 为奇数。
你真棒!
📝 题目解析
【考察内容】输出图形
【解析】此题考察循环控制与坐标变换的结合运用。通过设定中心点k,利用二维遍历中每个位置(i,j)到中心的曼哈顿距离是否等于k来决定输出‘#’或‘.’,从而构造出菱形轮廓。同时,考生也可使用模拟画图的方式构建代码,时间复杂度不变,同样可以通过题目,代码的复杂程度会稍高,适合考试中未找到中心点思路的考生。
#include <algorithm>
#include <cstdio>
using namespace std;
int main() {
int n, i, j, k;
scanf("%d", &n);
k = n / 2;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (abs(j - i) + abs(k - j + 1) == k)
printf("#");
else
printf(".");
}
printf("\n");
}
return 0;
}
【解析】此题考察循环控制与坐标变换的结合运用。通过设定中心点k,利用二维遍历中每个位置(i,j)到中心的曼哈顿距离是否等于k来决定输出‘#’或‘.’,从而构造出菱形轮廓。同时,考生也可使用模拟画图的方式构建代码,时间复杂度不变,同样可以通过题目,代码的复杂程度会稍高,适合考试中未找到中心点思路的考生。
#include <algorithm>
#include <cstdio>
using namespace std;
int main() {
int n, i, j, k;
scanf("%d", &n);
k = n / 2;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (abs(j - i) + abs(k - j + 1) == k)
printf("#");
else
printf(".");
}
printf("\n");
}
return 0;
}