1 条题解

  • 0
    @ 2026-6-19 10:30:17

    📝 题目大意

    给定一个 10×1010 \times 10 的字符矩阵,其中包含一个由 # 组成的矩形区域(其余位置为 .)。求该矩形区域的行范围 [A,B][A, B] 和列范围 [C,D][C, D]

    💡 解题思路

    1. 题目分析:输入保证是由题目描述的生成方式得到的,即 # 一定构成一个连续的矩形区域。数据范围极小(10×1010 \times 10),直接遍历即可。

    2. 算法推导

      • 遍历整个 10×1010 \times 10 矩阵,用变量 a,ba, b 记录 # 出现的行范围,c,dc, d 记录列范围。
      • 当遇到 # 时:
        • a=0a = 0(首次遇到 #),则 a=ia = i,记录起始行;否则 b=ib = i,更新终止行。
        • 同理,cc 记录起始列,dd 记录终止列。
      • 遍历结束后,aa 即为 # 第一次出现的行,bb 为最后一次出现的行;c,dc, d 同理。
      • 特判:若 b=0b = 0(即矩形只有一行),令 b=ab = a;若 d=0d = 0(矩形只有一列),令 d=cd = c
    3. 边界与细节

      • 矩阵下标从 11 开始,与题目一致。
      • 矩形可能只有一行或一列,此时 bbdd 永远不会在 else 分支被赋值,需要单独处理。
      • 输入保证答案唯一,无需考虑其他情况。

    ⏱️ 复杂度分析

    • 时间复杂度O(10×10)=O(1)O(10 \times 10) = O(1),常数级。
    • 空间复杂度O(10×10)=O(1)O(10 \times 10) = O(1),存储 10×1010 \times 10 的字符矩阵。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        char s[15][15];
        int a = 0, b = 0, c = 0, d = 0; // a:起始行, b:终止行, c:起始列, d:终止列
        // 读入 10×10 的字符矩阵
        for(int i = 1; i <= 10; i++){
            for(int j = 1; j <= 10; j++) cin >> s[i][j];
        }
        // 遍历矩阵,寻找 # 的行列范围
        for(int i = 1; i <= 10; i++){
            for(int j = 1; j <= 10; j++){
                if(s[i][j] == '#'){
                    if(a == 0) a = i;      // 首次遇到 #,记录起始行
                    else b = i;             // 更新终止行
                    if(c == 0) c = j;      // 首次遇到 #,记录起始列
                    else d = j;             // 更新终止列
                }
            }
        }
        // 特判:矩形只有一行时,终止行 = 起始行
        if(b == 0) b = a;
        // 特判:矩形只有一列时,终止列 = 起始列
        if(d == 0) d = c;
        cout << a << ' ' << b << endl << c << ' ' << d;
        return 0;
    }
    
    • 1

    信息

    ID
    634
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者