
本文详解如何通过智能翻转矩阵的行与列,使左上象限(前 n/2 行 × 前 n/2 列)元素和达到最大,并完整构造出对应最优矩阵;核心在于理解位置对称性约束与贪心配对策略。
本文详解如何通过智能翻转矩阵的行与列,使左上象限(前 n/2 行 × 前 n/2 列)元素和达到最大,并完整构造出对应最优矩阵;核心在于理解位置对称性约束与贪心配对策略。
在 HackerRank 等平台常见的“Matrix Game”类问题中,给定一个大小为 $ N \times N $ 的方阵($ N $ 为偶数),允许任意次执行两种操作:翻转某一行(reverse row)或翻转某一列(reverse column)。目标是使左上象限(即子矩阵 arr[0..N/2-1][0..N/2-1])所有元素之和最大化,并返回达成该最大和时的完整矩阵。
关键洞察在于:单次翻转操作不孤立改变某个元素,而是受限于对称位置组的置换关系。具体而言,对任意位置 $(i, j)$(其中 $0 \le i,j < N/2$),其与以下三个位置构成一个封闭的四元置换组:
- $(i,\; j)$ ← 左上象限目标位
- $(i,\; N-1-j)$ ← 同行右半区镜像
- $(N-1-i,\; j)$ ← 同列下半区镜像
- $(N-1-i,\; N-1-j)$ ← 右下象限对角位
这四个位置在任意行/列翻转序列下只能相互交换,无法跨组移动。因此,左上象限中每个位置 $(i,j)$ 实际可填入的值,仅能从该四元组中任选其一。
✅ 最优策略(贪心+分组):
对每个左上象限坐标 $(i,j)$,取出其对应的四元组:
int[] quad = {
arr[i][j],
arr[i][N-1-j],
arr[N-1-i][j],
arr[N-1-i][N-1-j]
};取其中最大值放入 result[i][j];其余三个值则按需分配至同组其余三位置(只要保证最终矩阵可通过合法翻转得到即可)。由于题目仅要求返回一个最优矩阵(而非所有解),我们采用最简构造法:
→ 将最大值置于 $(i,j)$;
→ 将次大值置于 $(i, N-1-j)$;
→ 将第三大值置于 $(N-1-i, j)$;
→ 将最小值置于 $(N-1-i, N-1-j)$。
该分配天然对应一组确定的翻转序列(虽无需显式还原操作步骤),且确保左上象限和最大。
以下是完整、高效、无循环试探的实现(时间复杂度 $O(N^2)$,空间 $O(N^2)$):
public static int[][] matrixGameOptimal(int[][] arr) {
int n = arr.length;
int[][] result = new int[n][n];
// 遍历左上象限每个位置 (i, j)
for (int i = 0; i < n / 2; i++) {
for (int j = 0; j < n / 2; j++) {
// 提取四元组
int a = arr[i][j];
int b = arr[i][n - 1 - j];
int c = arr[n - 1 - i][j];
int d = arr[n - 1 - i][n - 1 - j];
// 排序四元组(降序)
int[] quad = {a, b, c, d};
Arrays.sort(quad); // 升序
// 逆序取:quad[3] ≥ quad[2] ≥ quad[1] ≥ quad[0]
// 分配:最大→左上,次大→右上,第三→左下,最小→右下
result[i][j] = quad[3];
result[i][n - 1 - j] = quad[2];
result[n - 1 - i][j] = quad[1];
result[n - 1 - i][n - 1 - j] = quad[0];
}
}
return result;
}⚠️ 重要注意事项:
- 此解法不模拟翻转过程,而是基于数学对称性直接构造最优矩阵,避免了原代码中易陷入局部最优、无限循环或状态遗漏的风险;
- 原提问中 matrixGame() 的 while 循环策略本质是贪心启发式,但因翻转顺序依赖与状态耦合,无法保证全局最优,且未处理翻转不可逆导致的重复尝试;
- 本方案严格满足“仅通过行/列翻转可达”的约束——因为任意四元组的排列均可由至多两次翻转(如先翻某行再翻某列)实现;
- 若输入非方阵($N \times M$),只需将象限定义为前 $\lfloor N/2 \rfloor$ 行 × 前 $\lfloor M/2 \rfloor$ 列,四元组变为 $(i,j),\;(i,M-1-j),\;(N-1-i,j),\;(N-1-i,M-1-j)$,逻辑完全一致。
总结:解决此类矩阵翻转优化问题,应跳出“模拟操作”的思维定式,转而分析位置等价类(orbit under flip group action),以分组贪心替代暴力搜索——这是算法设计中“洞察结构优于枚举状态”的典型范例。

















