这题到底在考什么
把 n 行 n 列的每个位置看成坐标 (i,j),按角、上下边、左右边、内部四类输出字符。
对象
保留当前位置的行 i 和列 j;每个格子只根据它和边界 1、n 的关系决定字符。
为什么能这样做
n 最大 100,总共一万格,二重循环逐格输出最直接也最稳定。
先避开的坑
角同时也在边上,如果先判断边,四个角会被输出成 - 或 |。
n=5 的位置分类
演示进度
课堂要求:每一步都让学生说出当前保留了什么信息,以及下一步为什么不会漏答案。
把关键过程写成表
| 位置 | 条件 | 输出 |
|---|---|---|
| (1,1) | 第一行 + 第一列 | + |
| (1,3) | 第一行但不是角 | - |
| (3,1) | 第一列但不是角 | | |
| (3,3) | 不在边界 | * |
当堂检查
n=5 时 (5,4) 输出什么?
为什么角要先判断?
代码读慢一点
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if ((i == 1 || i == n) && (j == 1 || j == n)) {
cout << '+';
} else if (i == 1 || i == n) {
cout << '-';
} else if (j == 1 || j == n) {
cout << '|';
} else {
cout << '*';
}
}
cout << '\n';
}
return 0;
}
读代码抓这几处
- 二重循环决定输出顺序:先行后列。
- 判断顺序是角、横边、竖边、内部。
- 每完成一行必须输出换行。
复杂度与常见错误
复杂度:时间 O(n^2),空间 O(1)。
- 判断顺序错误,角被边覆盖。
- 忘记每行换行。
- 把 i 和 j 的含义写反。
源文件:GESP2/B4498.md · GESP2/B4498_solution.md