题目


思路
要解决这道题,核心是找到操作的本质规律------ 先分析 "相邻元素加减" 操作对矩阵的影响,再推导判断条件。
步骤 1:理解操作的本质
题目中 "相邻元素加减" 的操作(比如对 a[i][j] 和 a[i][j+1],同时 + 1 或 - 1),其实等价于:对矩阵中任意两个相邻元素,同时增加 / 减少同一个数。
观察这个操作对矩阵的影响:假设对元素 x 和 y 同时加 k,那么整个矩阵的元素总和变化量 是 k + k = 2k(即总和的变化是偶数)。
但更关键的是:矩阵中所有元素的 "奇偶性组合" 具有特定的不变性。
步骤 2:推导不变性(关键结论)
我们给矩阵的元素按 "棋盘格" 方式染色:
- 把
A[i][j]分为两类:(i+j) 是偶数的元素(记为 "黑格"),(i+j) 是奇数的元素(记为 "白格")。
此时,"相邻元素加减" 操作的对象,必然是一个黑格和一个白格 (因为相邻元素的 i+j 奇偶性不同)。
对这两个元素同时加 / 减 k,会导致:
- 黑格的总和变化
±k; - 白格的总和变化
±k; - 因此,黑格总和 与 白格总和的差值 不变 (因为
(黑+Δk) - (白+Δk) = 黑-白)。
步骤 3:判断条件
要将矩阵 A 转化为 B,需要满足:对 A 和 B 分别计算 黑格总和 - 白格总和,这两个差值必须相等。
验证题目中的示例
以题目中的 A 和 B 为例:
-
A的黑格(i+j偶):A[0][0]=1、A[0][2](无)、A[1][1]=4→ 黑总和 = 1+4=5;白格(i+j奇):A[0][1]=2、A[1][0]=3→ 白总和 = 2+3=5;差值:5-5=0。 -
B的所有元素都是 0 → 黑总和 = 0,白总和 = 0 → 差值 = 0-0=0。
两者差值相等,所以可以转化(与题目示例结果一致)。
解题步骤
对每个测试用例:
- 分别计算矩阵
A的 黑格总和 - 白格总和 (记为diffA); - 分别计算矩阵
B的 黑格总和 - 白格总和 (记为diffB); - 若
diffA == diffB,输出Yes;否则输出No。
代码
cpp
#include <stdio.h>
int main() {
int T;
scanf("%d", &T);
while (T--) {
int n, m;
scanf("%d%d", &n, &m);
// 计算矩阵A的diff
long long diffA = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
long long x;
scanf("%lld", &x);
if ((i + j) % 2 == 0) {
diffA += x;
} else {
diffA -= x;
}
}
}
// 计算矩阵B的diff
long long diffB = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
long long x;
scanf("%lld", &x);
if ((i + j) % 2 == 0) {
diffB += x;
} else {
diffB -= x;
}
}
}
// 判断
if (diffA == diffB) {
printf("Yes\n");
} else {
printf("No\n");
}
}
return 0;
}