B4498 [GESP202603 二级] 画画

二重循环 / 坐标分类 / 图形输出

一、先回答问题

这题到底在考什么

把 n 行 n 列的每个位置看成坐标 (i,j),按角、上下边、左右边、内部四类输出字符。

对象

保留当前位置的行 i 和列 j;每个格子只根据它和边界 1、n 的关系决定字符。

为什么能这样做

n 最大 100,总共一万格,二重循环逐格输出最直接也最稳定。

先避开的坑

角同时也在边上,如果先判断边,四个角会被输出成 - 或 |。

二、互动演示

n=5 的位置分类

演示进度

课堂要求:每一步都让学生说出当前保留了什么信息,以及下一步为什么不会漏答案。

三、手推结果

把关键过程写成表

位置条件输出
(1,1)第一行 + 第一列+
(1,3)第一行但不是角-
(3,1)第一列但不是角|
(3,3)不在边界*
四、自己选答案

当堂检查

n=5 时 (5,4) 输出什么?
为什么角要先判断?
五、C++14 参考代码

代码读慢一点

#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)。

源文件:GESP2/B4498.md · GESP2/B4498_solution.md