A128501.装饰花园
2026-07-10 18:48:31
发布于:天津
7阅读
0回复
0点赞
A128501.装饰花园
题目描述
Sherry 正在改造花园,她希望在花园中有计划地种植两种不同的植物,这样等植物都长成后,就能够得到一个想要的图案。
花园可以视为一个 n × n 的二维网格,其中网格的每个位置需要种植一种植物,用 * 和 # 来表示可以选择的两种植物。Sherry 计划在边界和两条对角线上种植 * 表示的植物,在其他位置种植 # 表示的植物。
Sherry 希望你能帮她画图符合她要求的花园示意图,让她提前看看效果如何。
输入格式
输入一个奇数 n,表示花园的大小为 n × n。
输出格式
输出 n 行,每行 n 个字符,表示花园对应位置的种植情况。
数据范围
1 ≤ n ≤ 100- 数据保证
n是奇数。
核心思路
- 对于一个
n × n的网格,位置用(i, j)表示(0 ≤ i, j < n)。 - 需要输出
*的位置有以下四类:- 上边界:
i == 0 - 下边界:
i == n - 1 - 左边界:
j == 0 - 右边界:
j == n - 1 - 主对角线:
i == j - 副对角线:
i + j == n - 1
- 上边界:
- 只要满足以上任意一个条件,该位置就输出
*,否则输出#。 - 直接遍历所有位置,逐行逐列判断即可,时间复杂度
O(n²),完全满足n ≤ 100的数据范围。
代码实现(all AC,可放心食用)
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 || i == n - 1 || j == 0 || j == n - 1 || i == j || i + j == n - 1)
cout << '*';
else
cout << '#';
}
cout << '\n';
}
return 0;
}
代码详解
1. 输入
int n;
cin >> n;
- 读入一个奇数
n,表示网格大小。
2. 双重循环遍历网格
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// ...
}
cout << '\n';
}
- 外层循环控制行
i,内层循环控制列j。 - 每输出完一行后,换行。
3. 判断当前位置
if (i == 0 || i == n - 1 || j == 0 || j == n - 1 || i == j || i + j == n - 1)
cout << '*';
else
cout << '#';
i == 0:第一行(上边界)i == n - 1:最后一行(下边界)j == 0:第一列(左边界)j == n - 1:最后一列(右边界)i == j:主对角线i + j == n - 1:副对角线
只要满足以上任意一个条件,就输出 *,否则输出 #。
4. 输出
cout << '\n';
- 每行结束后换行,保证输出格式正确。
示例分析
示例 1
输入:
5
输出:
*****
**#**
*#*#*
**#**
*****
手动验证(以第 3 行 i = 2 为例):
j = 0:左边界 →*j = 1:i == j?否;i + j == 4?2 + 1 = 3 ≠ 4→#j = 2:i == j成立 →*j = 3:i + j == 4?2 + 3 = 5 ≠ 4→#j = 4:右边界 →*
得到 *#*#*,与输出一致。
示例 2
输入:
7
输出:
*******
**###**
*#*#*#*
*##*##*
*#*#*#*
**###**
*******
同样满足边界 + 两条对角线的规则。
复杂度分析
- 时间复杂度:
O(n²),遍历整个网格。 - 空间复杂度:
O(1),仅使用常数个变量。



这里空空如也







有帮助,赞一个