1. 对于 nxn 的矩阵 matrix,各种对称的转移式如下:
上下对称:matrix[i][j] -> matrix[n-i-1][j],(列不变)
左右对称:matrix[i][j] -> matrix[i][n-j-1],(行不变)
主对角线对称:matrix[i][j] -> matrix[j][i],(行列互换)
副对角线对称:matrix[i][j] -> matrix[n-j-1][n-i-1] (行列均变,且互换)
2.对于顺时针 90° 旋转
matrix[i][j] -> matrix[j][n-i-1]
可以分解为:
上下对称 + 主对角线对称
或者
主对角线对称 + 左右对称
3.逆时针 90° 旋转
matrix[i][j] -> matrix[n-j-1][i]
可以分解为:
左右对称 + 主对角线对称
或者
主对角线对称 + 上下对称
4. 对称分解
// 上下对称
void upDownSymmetry(vector<vector<int>>& matrix) {
for (int i = 0; i < n/2; ++i) {
for (int j = 0; j < n; ++j) {
swap(matrix[i][j], matrix[n-i-1][j]);
}
}
}
// 左右对称
void leftRightSymmetry(vector<vector<int>>& matrix) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n/2; ++j) {
swap(matrix[i][j], matrix[i][n-j-1]);
}
}
}
// 主对角线对称
void mainDiagSymmetry(vector<vector<int>>& matrix) {
for (int i = 0; i < n-1; ++i) {
for (int j = i + 1; j < n; ++j) {
swap(matrix[i][j], matrix[j][i]);
}
}
}
// 副对角线对称
void subdiagSymmetry(vector<vector<int>>& matrix) {
for (int i = 0; i < n-1; ++i) {
for (int j = 0; j < n-i-1; ++j) {
swap(matrix[i][j], matrix[n-j-1][n-i-1]);
}
}
}