跳过并跳转到主要内容

菱形

给定一个大于 1 的奇数 n,要求按规则输出一个 n 行 n 列的字符画。

题库1分钟阅读

小 A 想绘制一个菱形。具体来说,需要绘制的菱形是一个 nnnn 列的字符画,nn 是一个大于 11 的奇数。菱形的四个顶点依次位于第 11 行、第 11 列、第 nn 行、第 nn 列的正中间,使用 # 绘制。相邻顶点之间也用 # 连接。其余位置都是 .

例如,一个 5555 列的菱形字符画是这样的:

..#..
.#.#.
#...#
.#.#.
..#..

给定 nn,请你帮小 A 绘制对应的菱形。

输入格式

一行,一个正整数 nn

输出格式

输出共 nn 行,表示对应的菱形。

样例

输入样例 1

3

输出样例 1

.#.
#.#
.#.

输入样例 2

9

输出样例 2

....#....
...#.#...
..#...#..
.#.....#.
#.......#
.#.....#.
..#...#..
...#.#...
....#....

数据范围

对于所有测试点,保证 3n293 \leq n \leq 29 并且 nn 为奇数。

题目给出的 nn 保证是一个奇数,且菱形的中心点坐标正好是整个正方形的中心。如果我们将坐标从 0n-1 进行编号:

  • 中心点坐标为:cx=n/2cx = n / 2, cy=n/2cy = n / 2(利用 C++ 整数除法自动向下取整)。

对于图形中的任意一个点 (i,j)(i, j),它到中心点 (cx,cy)(cx, cy)曼哈顿距离(即横向距离加上纵向距离)为:

icx+jcy|i - cx| + |j - cy|

观察菱形的边缘特征可以发现:

  • 菱形的边界上的所有点,到中心点的曼哈顿距离正好等于 n/2n / 2
  • 其他不在边界上的点,其曼哈顿距离不等于 n/2n / 2

因此,我们只需要用两重循环遍历 n×nn \times n 的网格,对于每一个点 (i,j)(i, j),判断 abs(i - n/2) + abs(j - n/2) == n/2 是否成立。如果成立则输出 #,否则输出 .

曼哈顿距离(Manhattan Distance),又称城市街区距离L1 距离,是指两点在标准坐标系上的绝对轴距总和。在二维平面中,它表示沿水平和垂直方向走过的距离之和,即只能沿着网格线“直角行走”的最短路径。

在平面直角坐标系中,设两个点分别为 A(x₁, y₁) 和 B(x₂, y₂),它们之间的曼哈顿距离 d 计算公式为:

d=x1x2+y1y2d=|x_{1}-x_{2}|+|y_{1}-y_{2}|

示例: 若从点 (1, 3) 走到点 (5, 6),曼哈顿距离为:

15+36=4+3=7|1-5|+|3-6|=4+3=7

将定义拓展到多维空间,两点 X(x1,x2,,xn)X(x_1, x_2, \dots, x_n)Y(y1,y2,,yn)Y(y_1, y_2, \dots, y_n) 之间的曼哈顿距离为它们在各个维度的坐标差绝对值总和:

d=i=1nxiyid=\sum _{i=1}^{n}|x_{i}-y_{i}|

  • 城市规划与导航: 在道路呈网格状布局的城市(如曼哈顿)中,车辆无法穿楼而过,实际行驶的最短路径即为曼哈顿距离。
  • 机器学习: 作为距离度量指标(L1范数)用于 KNN 分类算法、决策树及回归分析,有时其抗噪能力优于欧氏距离。
  • 算法与图形学: 在计算机网格寻路(如 AA^{*} 算法的启发函数)和早期像素图形处理中,曼哈顿距离只需加减法运算,能避开计算昂贵的开平方操作,效率更高。

#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n;
cin >> n;
int center = n / 2; // 中心点坐标
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// 判断当前点到中心点的曼哈顿距离是否等于 n / 2
if (abs(i - center) + abs(j - center) == center) {
cout << '#';
} else {
cout << '.';
}
}
cout << endl; // 换行
}
return 0;
}

© 2026 五五开 · 一方通行,只管向前。

旅途由 Astro 驱动 · 主题 Chirping Astro