1 条题解
-
0
📝 题目大意
给定一个 的字符矩阵,其中包含一个由
#组成的矩形区域(其余位置为.)。求该矩形区域的行范围 和列范围 。💡 解题思路
-
题目分析:输入保证是由题目描述的生成方式得到的,即
#一定构成一个连续的矩形区域。数据范围极小(),直接遍历即可。 -
算法推导:
- 遍历整个 矩阵,用变量 记录
#出现的行范围, 记录列范围。 - 当遇到
#时:- 若 (首次遇到
#),则 ,记录起始行;否则 ,更新终止行。 - 同理, 记录起始列, 记录终止列。
- 若 (首次遇到
- 遍历结束后, 即为
#第一次出现的行, 为最后一次出现的行; 同理。 - 特判:若 (即矩形只有一行),令 ;若 (矩形只有一列),令 。
- 遍历整个 矩阵,用变量 记录
-
边界与细节:
- 矩阵下标从 开始,与题目一致。
- 矩形可能只有一行或一列,此时 或 永远不会在
else分支被赋值,需要单独处理。 - 输入保证答案唯一,无需考虑其他情况。
⏱️ 复杂度分析
- 时间复杂度:,常数级。
- 空间复杂度:,存储 的字符矩阵。
💻 标准代码 (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
- 上传者