1. 01回文矩阵问题解析
1.1 问题核心理解
这道题目要求我们判断一个由0和1组成的n×m矩阵中,每个位置是否能够成为某个回文数字的一部分。关键在于理解回文数字在矩阵中的表现形式。
回文数字的特点是正读反读都相同,在矩阵中表现为对称性。对于矩阵中的每个元素(0或1),我们需要判断它是否有可能成为某个回文数字的一部分。具体来说:
- 如果一个位置是1,那么整个矩阵中至少要有两个1(包括它自己),这样它才能与另一个1形成对称
- 同理,如果一个位置是0,整个矩阵中至少要有两个0
1.2 解题思路详解
基于上述理解,解题步骤可以分解为:
- 首先遍历整个矩阵,统计0和1的总数
- 然后再次遍历矩阵,对每个位置:
- 如果是0,检查矩阵中0的总数是否大于1
- 如果是1,检查矩阵中1的总数是否大于1
- 根据检查结果输出"Y"或"N"
这个思路的关键在于认识到:一个数字要成为回文的一部分,至少需要另一个相同的数字与之配对。
1.3 代码实现与优化
cpp复制#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
int n, m;
void solve() {
int cnt0 = 0, cnt1 = 0;
cin >> n >> m;
vector<vector<char>> a(n + 1, vector<char>(m + 1));
// 第一次遍历:统计0和1的数量
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
if (a[i][j] == '0') cnt0++;
else cnt1++;
}
}
// 第二次遍历:判断每个位置
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (a[i][j] == '0') {
cout << (cnt0 > 1 ? "Y" : "N");
} else {
cout << (cnt1 > 1 ? "Y" : "N");
}
}
cout << '\n'; // 使用'\n'代替endl提高效率
}
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0);
int T; cin >> T;
while (T--) solve();
r
