题目解析
* 输入输出:输入一个奇数 nnn(n>1n > 1n>1);输出一个 n×nn \times nn×n 的字符矩阵,其中菱形的边框用 # 表示,内部和外部用 . 表示。菱形的四个顶点分别位于第一行中间、最后一行中间、第一列中间和最后一列中间。
* 数据范围:1≤n≤291 \leq n \leq 291≤n≤29 且 nnn 为奇数,规模极小,允许 O(n2)O(n^2)O(n2) 的暴力绘制。
* 复杂度要求:时间复杂度 O(n2)O(n^2)O(n2),空间复杂度 O(1)O(1)O(1)(不计输出缓冲区)。
* 算法知识点:模拟、坐标几何、曼哈顿距离、直线方程
思路解析
本题本质是在二维网格上绘制菱形边框。由于 nnn 最大仅为 292929,直接枚举每个位置 (i,j)(i, j)(i,j) 并判断其是否位于菱形的边上即可。下面给出两种等价的判定方法:
方法一:四边直线方程判定(代码一)
将菱形视为四条线段围成的区域,分别对应四条直线:
1. 上边(左上到右上):i+j=mid+1i + j = \text{mid} + 1i+j=mid+1
2. 左边(左上到左下):i−j=mid−1i - j = \text{mid} - 1i−j=mid−1
3. 右边(右上到右下):j−i=mid−1j - i = \text{mid} - 1j−i=mid−1
4. 下边(左下到右下):i+j=n+midi + j = n + \text{mid}i+j=n+mid
其中 mid=(n+1)/2\text{mid} = (n+1)/2mid=(n+1)/2 为中心行(列)号。若点 (i,j)(i,j)(i,j) 满足上述任一方程,则该点在菱形边上。
方法二:曼哈顿距离判定(代码二)
利用几何性质:该菱形是中心在 (mid,mid)(\text{mid}, \text{mid})(mid,mid) 的旋转正方形,其边界恰好由到中心曼哈顿距离等于 mid−1\text{mid}-1mid−1 的所有点构成。即满足:
∣i−mid∣+∣j−mid∣=mid−1|i - \text{mid}| + |j - \text{mid}| = \text{mid} - 1 ∣i−mid∣+∣j−mid∣=mid−1
此方法更简洁,且易于理解菱形的几何本质。
完整代码