本文翻译自:How do you rotate a two dimensional array?
Inspired by Raymond Chen's post , say you have a 4x4 two dimensional array, write a function that rotates it 90 degrees. 受雷蒙德·陈 ( Raymond Chen)的启发,假设您有一个4x4二维数组,编写了一个将其旋转90度的函数。 Raymond links to a solution in pseudo code, but I'd like to see some real world stuff. 雷蒙德(Raymond)链接到伪代码的解决方案,但我希望看到一些真实世界的东西。
[1][2][3][4]
[5][6][7][8]
[9][0][1][2]
[3][4][5][6]
Becomes: 成为:
[3][9][5][1]
[4][0][6][2]
[5][1][7][3]
[6][2][8][4]
Update : Nick's answer is the most straightforward, but is there a way to do it better than n^2? 更新 :尼克的答案是最直接的,但是有没有办法比n ^ 2更好呢? What if the matrix was 10000x10000? 如果矩阵是10000x10000,该怎么办?
#1楼
参考:https://stackoom.com/question/B3n/如何旋转二维数组
#2楼
This is my implementation, in C, O(1) memory complexity, in place rotation, 90 degrees clockwise: 这是我的实现,在C,O(1)内存复杂性中,顺时针旋转90度:
#include <stdio.h>
#define M_SIZE 5
static void initMatrix();
static void printMatrix();
static void rotateMatrix();
static int m[M_SIZE][M_SIZE];
int main(void){
initMatrix();
printMatrix();
rotateMatrix();
printMatrix();
return 0;
}
static void initMatrix(){
int i, j;
for(i = 0; i < M_SIZE; i++){
for(j = 0; j < M_SIZE; j++){
m[i][j] = M_SIZE*i + j + 1;
}
}
}
static void printMatrix(){
int i, j;
printf("Matrix\n");
for(i = 0; i < M_SIZE; i++){
for(j = 0; j < M_SIZE; j++){
printf("%02d ", m[i][j]);
}
printf("\n");
}
printf("\n");
}
static void rotateMatrix(){
int r, c;
for(r = 0; r < M_SIZE/2; r++){
for(c = r; c < M_SIZE - r - 1; c++){
int tmp = m[r][c];
m[r][c] = m[M_SIZE - c - 1][r];
m[M_SIZE - c - 1][r] = m[M_SIZE - r - 1][M_SIZE - c - 1];
m[M_SIZE - r - 1][M_SIZE - c - 1] = m[c][M_SIZE - r - 1];
m[c][M_SIZE - r - 1] = tmp;
}
}
}
#3楼
This a better version of it in Java: I've made it for a matrix with a different width and height 这是Java的更好版本:我已经将其用于宽度和高度不同的矩阵
- h is here the height of the matrix after rotating h是旋转后矩阵的高度
- w is here the width of the matrix after rotating w是旋转后矩阵的宽度
public int[][] rotateMatrixRight(int[][] matrix)
{
/* W and H are already swapped */
int w = matrix.length;
int h = matrix[0].length;
int[][] ret = new int[h][w];
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
ret[i][j] = matrix[w - j - 1][i];
}
}
return ret;
}
public int[][] rotateMatrixLeft(int[][] matrix)
{
/* W and H are already swapped */
int w = matrix.length;
int h = matrix[0].length;
int[][] ret = new int[h][w];
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
ret[i][j] = matrix[j][h - i - 1];
}
}
return ret;
}
This code is based on Nick Berardi's post. 该代码基于Nick Berardi的帖子。
#4楼
#transpose is a standard method of Ruby's Array class, thus: #transpose是Ruby的Array类的标准方法,因此:
% irb
irb(main):001:0> m = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 0, 1, 2], [3, 4, 5, 6]]
=> [[1, 2, 3, 4], [5, 6, 7, 8], [9, 0, 1, 2], [3, 4, 5, 6]]
irb(main):002:0> m.reverse.transpose
=> [[3, 9, 5, 1], [4, 0, 6, 2], [5, 1, 7, 3], [6, 2, 8, 4]]
The implementation is an n^2 transposition function written in C. You can see it here: http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-transpose by choosing "click to toggle source" beside "transpose". 该实现是用C语言编写的n ^ 2换位函数。您可以在此处看到它: http : //www.ruby-doc.org/core-1.9.3/Array.html#method-i-transpose通过选择“单击在“移调”旁边切换源”。
I recall better than O(n^2) solutions, but only for specially constructed matrices (such as sparse matrices) 我记得比O(n ^ 2)解要好,但仅适用于特殊构造的矩阵(例如稀疏矩阵)
#5楼
C code for matrix rotation 90 degree clockwise IN PLACE for any M*N matrix 任意M * N矩阵的C轴顺时针旋转90度的C代码
void rotateInPlace(int * arr[size][size], int row, int column){
int i, j;
int temp = row>column?row:column;
int flipTill = row < column ? row : column;
for(i=0;i<flipTill;i++){
for(j=0;j<i;j++){
swapArrayElements(arr, i, j);
}
}
temp = j+1;
for(i = row>column?i:0; i<row; i++){
for(j=row<column?temp:0; j<column; j++){
swapArrayElements(arr, i, j);
}
}
for(i=0;i<column;i++){
for(j=0;j<row/2;j++){
temp = arr[i][j];
arr[i][j] = arr[i][row-j-1];
arr[i][row-j-1] = temp;
}
}
}
#6楼
Here is my attempt for matrix 90 deg rotation which is a 2 step solution in C. First transpose the matrix in place and then swap the cols. 这是我对矩阵进行90度旋转的尝试,这是C语言中的两步解决方案。首先将矩阵转置到位,然后交换cols。
#define ROWS 5
#define COLS 5
void print_matrix_b(int B[][COLS], int rows, int cols)
{
for (int i = 0; i <= rows; i++) {
for (int j = 0; j <=cols; j++) {
printf("%d ", B[i][j]);
}
printf("\n");
}
}
void swap_columns(int B[][COLS], int l, int r, int rows)
{
int tmp;
for (int i = 0; i <= rows; i++) {
tmp = B[i][l];
B[i][l] = B[i][r];
B[i][r] = tmp;
}
}
void matrix_2d_rotation(int B[][COLS], int rows, int cols)
{
int tmp;
// Transpose the matrix first
for (int i = 0; i <= rows; i++) {
for (int j = i; j <=cols; j++) {
tmp = B[i][j];
B[i][j] = B[j][i];
B[j][i] = tmp;
}
}
// Swap the first and last col and continue until
// the middle.
for (int i = 0; i < (cols / 2); i++)
swap_columns(B, i, cols - i, rows);
}
int _tmain(int argc, _TCHAR* argv[])
{
int B[ROWS][COLS] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17, 18, 19, 20},
{21, 22, 23, 24, 25}
};
matrix_2d_rotation(B, ROWS - 1, COLS - 1);
print_matrix_b(B, ROWS - 1, COLS -1);
return 0;
}