翻转
矩阵坐标从(1,1)开始。
翻转第 x0 到第 x1 行,第 y0 到第 y1 列的子矩阵:
- oi=1:上下翻转
- oi=-1:左右翻转
void fan_zhuan(int x0, int y0, int x1, int y1, int oi) {
if (oi == 1) { // 上下翻转
while (x0 < x1) {
for (int i = y0; i <= y1; i++) {
swap(a[x0][i], a[x1][i]);
}
x0++; x1--;
}
} else { // 左右翻转
while (y0 < y1) {
for (int i = x0; i <= x1; i++) {
swap(a[i][y0], a[i][y1]);
}
y0++; y1--;
}
}
}
旋转
注意:逆时针转 i 次 90 度 == 顺时针转 4-i 次 90 度;此处代码实现顺时针旋转。
a 为原矩阵,b 为辅助矩阵。如果是旋转整个边长为 l 的正方形矩阵,公式如下:
- 顺时针转 90 度:b[j][l-i+1] = a[i][j]
- 顺时针转 180 度:b[l-i+1][l-j+1] = a[i][j]
- 顺时针转 270 度:b[l-j+1][i] = a[i][j]
只旋转左上角为(x,y),边长为 l 的 l*l 小矩阵,只需在 a 的下标加上偏移量。小矩阵第 i 行即原矩阵的 x+i-1 行,小矩阵的第 j 列即原矩阵的 y+j-1 行。
/* 左上角坐标(x,y), 边长 l,顺时针旋转 90 度*t 次 */
void xuan_zhuan(int x, int y, int l, int t) {
char b[N][N]; // 辅助矩阵,坐标从 (1,1) 开始,只存需要旋转的小矩阵
if (t == 0) return; // 旋转 0 次
(t == ) {
( i = ; i <= l; i++) {
( j = ; j <= l; j++) {
b[j][l - i + ] = a[x + i - ][y + j - ];
}
}
} (t == ) {
( i = ; i <= l; i++) {
( j = ; j <= l; j++) {
b[l - i + ][l - j + ] = a[x + i - ][y + j - ];
}
}
} (t == ) {
( i = ; i <= l; i++) {
( j = ; j <= l; j++) {
b[l - j + ][i] = a[x + i - ][y + j - ];
}
}
}
( i = ; i <= l; i++) {
(&a[x + i - ][y], &b[i][], l * ());
}
}


