private void rotate(int m, int n, int[][] source, int[][] dest) {
for (int r = 0; r < m; r++) {
for (int c = 0; c < n; c++) {
dest[c][m - 1 - r] = source[r][c];
}
}
}
static class _1st {
public static void main(String[] args) {
_1st handler = new _1st();
int[][] source = {{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}};
int m = source.length, n = source[0].length;
handler.display(source, m, n);
int[][] dest = new int[n][m];
handler.rotate(m, n, source, dest);
handler.display(dest, n, m);
}
/**
* @param m source的 row
* @param n source的 col
* @param source 源矩阵
* @param dest 目标矩阵
*/
private void rotate(int m, int n, int[][] source, int[][] dest) {
for (int r = 0; r < m; r++) {
for (int c = 0; c < n; c++) {
dest[c][m - 1 - r] = source[r][c];
}
}
}
private void display(int[][] matrix, int R, int C) {
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
System.out.printf("%d\t", matrix[r][c]);
}
System.out.print("\n");
}
}
}
public void rotate(int[][] matrix) {
//考虑每一个环
int R = matrix.length, C = matrix[0].length;
for (int x = 0; x < R / 2; x++) {
for (int y = x; y < R - x - 1; y++) {
int t = matrix[x][y];
matrix[x][y] = matrix[R - 1 - y][x];
matrix[R - 1 - y][x] = matrix[R - 1 - x][C - 1 - y];
matrix[R - 1 - x][C - 1 - y] = matrix[y][C - 1 - x];
matrix[y][C - 1 - x] = t;
}
}
}
public void rotate(int[][] matrix) {
transpose(matrix);
reverseColumns(matrix);
}
//按矩阵的的列翻转 翻转的是第一列和最后一列 第二列和倒数第二列 如此...
private void reverseColumns(int[][] matrix) {
for (int i = 0; i < matrix.length; i++) {
for (int j = 0, k = matrix.length - 1; j < k; j++, k--) {
int t = matrix[i][j];//[i,j] <-> [i,k]
matrix[i][j] = matrix[i][k];
matrix[i][k] = t;
}
}
}
//转置
private void transpose(int[][] matrix) {
for (int r = 0; r < matrix.length; r++) {
for (int c = r; c < matrix[0].length; c++) {
int t = matrix[c][r];
matrix[c][r] = matrix[r][c];
matrix[r][c] = t;
}
}
}
public int[][] transpose(int[][] matrix) {
int R = matrix.length,C= matrix[0].length;
int[][] res = new int[C][R];
for(int i =0;i<R;i++){
for(int j =0;j<C;j++){
res[j][i] = matrix[i][j];
}
}
return res;
}