1 条题解
-
0
B. 是否为正方形 - 详细题解
问题重述
给定一个二进制字符串 ,它是由一个美丽的二进制矩阵(边缘全为 ,内部全为 )按行展开得到的。判断这个矩阵是否可能是正方形矩阵(即行数等于列数)。
美丽矩阵的性质
一个大小为 的美丽矩阵具有以下结构:
- 第一行全部为
- 最后一行全部为
- 第一列全部为
- 最后一列全部为
- 内部(除去边缘)全部为
例如,一个 的美丽矩阵为:
$$\begin{bmatrix} 1 & 1 & 1 \\ 1 & 0 & 1 \\ 1 & 1 & 1 \end{bmatrix} $$
关键观察
观察 1:矩阵按行展开
字符串 是通过逐行连接矩阵的所有行得到的。因此:
- 前 个字符对应第 行
- 第 到 个字符对应第 行
- 以此类推
观察 2: 或 的情况
当行数 或列数 时,矩阵没有内部区域(因为边缘覆盖了整个矩阵)。此时,整个矩阵全为 ,字符串也全为 。
结论:若字符串全为 ,则只有当 (即 )时,矩阵才是正方形。因为:
- :,但题目保证 ,不可能
- :,但 不是正方形
- :,是正方形 ✓
- :,但 不是正方形
观察 3:存在 的情况
如果字符串中存在 ,设第一个 出现在位置 (从 开始索引)。
由于美丽矩阵的第一行全是 ,第一列也全是 ,第一个 只能出现在第 行第 列的位置(即矩阵内部)。
分析索引关系:
- 第 行有 个 ,对应字符串的索引 到
- 第 行的第一个字符(第 行第 列)也是 (因为第一列全是 )
- 所以第 行第 列是第一个可能为 的位置
因此,第一个 在字符串中的索引为:
其中 是矩阵的列数。
观察 4:由 确定 和
由 可得:
由于矩阵是正方形的,有 ,所以:
矩阵的总元素个数为:
$$n = r \times c = (id - 1) \times (id - 1) = (id - 1)^2 $$结论:若字符串中存在 ,则原矩阵是正方形的充要条件是:
其中 是第一个 的位置(从 开始计数)。
算法步骤
- 读入字符串长度 和字符串
- 找到第一个 的位置 (从 开始)
- 情况 1:(字符串全为 )
- 若 ,输出
"Yes" - 否则输出
"No"
- 若 ,输出
- 情况 2:(字符串存在 )
- 计算
- 若 ,输出
"Yes" - 否则输出
"No"
完整代码
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int n; cin >> n; string s; cin >> s; // 找到第一个 '0' 的位置 int id = 0; while (id < n && s[id] == '1') { id++; } // 情况1:全为 '1' if (id == n) { if (n == 4) { cout << "Yes" << endl; } else { cout << "No" << endl; } } // 情况2:存在 '0' else { int r = id - 1; // 正方形的边长 if (r * r == n) { cout << "Yes" << endl; } else { cout << "No" << endl; } } } return 0; }
时间复杂度
- 每次查找第一个 :
- 总复杂度:
示例验证
测试 情况 条件 输出 1 2 112(全1) 全1 No 2 4 11114(全1) Yes 3 9 1111011114 有0 4 1111111119(全1) 全1 No 5 12 1111100111115 有0 与样例输出完全一致。
- 1
信息
- ID
- 6326
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者