菱形
给定一个大于 1 的奇数 n,要求按规则输出一个 n 行 n 列的字符画。
题库1分钟阅读
小 A 想绘制一个菱形。具体来说,需要绘制的菱形是一个 行 列的字符画, 是一个大于 的奇数。菱形的四个顶点依次位于第 行、第 列、第 行、第 列的正中间,使用
#绘制。相邻顶点之间也用#连接。其余位置都是.。例如,一个 行 列的菱形字符画是这样的:
..#...#.#.#...#.#.#...#..给定 ,请你帮小 A 绘制对应的菱形。
输入格式
一行,一个正整数 。
输出格式
输出共 行,表示对应的菱形。
样例
输入样例 1
3输出样例 1
.#.#.#.#.输入样例 2
9输出样例 2
....#.......#.#.....#...#...#.....#.#.......#.#.....#...#...#.....#.#.......#....数据范围
对于所有测试点,保证 并且 为奇数。
题目给出的 保证是一个奇数,且菱形的中心点坐标正好是整个正方形的中心。如果我们将坐标从 0 到 n-1 进行编号:
- 中心点坐标为:, (利用 C++ 整数除法自动向下取整)。
对于图形中的任意一个点 ,它到中心点 的曼哈顿距离(即横向距离加上纵向距离)为:
观察菱形的边缘特征可以发现:
- 菱形的边界上的所有点,到中心点的曼哈顿距离正好等于 。
- 其他不在边界上的点,其曼哈顿距离不等于 。
因此,我们只需要用两重循环遍历 的网格,对于每一个点 ,判断 abs(i - n/2) + abs(j - n/2) == n/2 是否成立。如果成立则输出 #,否则输出 .。
曼哈顿距离(Manhattan Distance),又称城市街区距离或 L1 距离,是指两点在标准坐标系上的绝对轴距总和。在二维平面中,它表示沿水平和垂直方向走过的距离之和,即只能沿着网格线“直角行走”的最短路径。
在平面直角坐标系中,设两个点分别为 A(x₁, y₁) 和 B(x₂, y₂),它们之间的曼哈顿距离 d 计算公式为:
示例: 若从点 (1, 3) 走到点 (5, 6),曼哈顿距离为:
将定义拓展到多维空间,两点 和 之间的曼哈顿距离为它们在各个维度的坐标差绝对值总和:
- 城市规划与导航: 在道路呈网格状布局的城市(如曼哈顿)中,车辆无法穿楼而过,实际行驶的最短路径即为曼哈顿距离。
- 机器学习: 作为距离度量指标(L1范数)用于 KNN 分类算法、决策树及回归分析,有时其抗噪能力优于欧氏距离。
- 算法与图形学: 在计算机网格寻路(如 算法的启发函数)和早期像素图形处理中,曼哈顿距离只需加减法运算,能避开计算昂贵的开平方操作,效率更高。
#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;}