Rotate Matrix by 90 Degrees
Understanding the Problem
The goal is to rotate a given square matrix by 90 degrees clockwise.
Method 1: Using a Temporary Matrix
This method uses a temporary matrix to store the rotated values.
#include <iostream> using namespace std; void rotateMatrix(int matrix[][100], int n) { int temp[100][100]; // Store the rotated values in a temporary matrix for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { temp[j][n - 1 - i] = matrix[i][j]; } } // Copy the temporary matrix back to the original matrix for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { matrix[i][j] = temp[i][j]; } } } void printMatrix(int matrix[][100], int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << matrix[i][j] << " "; } cout << endl; } } int main() { int matrix[100][100] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; int n = 3; rotateMatrix(matrix, n); cout << "Rotated Matrix:\n"; printMatrix(matrix, n); return 0; }
Output:
Rotated Matrix: 7 4 1 8 5 2 9 6 3
Method 2: In-Place Rotation
This method rotates the matrix in place without using extra space.
#include <iostream> using namespace std; void rotateMatrix(int matrix[][100], int n) { // Transpose the matrix for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { swap(matrix[i][j], matrix[j][i]); } } // Reverse each row for (int i = 0; i < n; i++) { for (int j = 0; j < n / 2; j++) { swap(matrix[i][j], matrix[i][n - 1 - j]); } } } void printMatrix(int matrix[][100], int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << matrix[i][j] << " "; } cout << endl; } } int main() { int matrix[100][100] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; int n = 3; rotateMatrix(matrix, n); cout << "Rotated Matrix:\n"; printMatrix(matrix, n); return 0; }
Output:
Rotated Matrix: 7 4 1 8 5 2 9 6 3
Method 3: Using Layer by Layer Rotation
This method rotates the matrix by working on concentric layers from outer to inner, swapping elements in groups of four.
#include <iostream> using namespace std; void rotateMatrix(int matrix[][100], int n) { for (int layer = 0; layer < n / 2; layer++) { int first = layer; int last = n - 1 - layer; for (int i = first; i < last; i++) { int offset = i - first; // Save the top element int top = matrix[first][i]; // Move left element to top matrix[first][i] = matrix[last - offset][first]; // Move bottom element to left matrix[last - offset][first] = matrix[last][last - offset]; // Move right element to bottom matrix[last][last - offset] = matrix[i][last]; // Assign top element to right matrix[i][last] = top; } } } void printMatrix(int matrix[][100], int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << matrix[i][j] << " "; } cout << endl; } } int main() { int matrix[100][100] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16} }; int n = 4; cout << "Original Matrix:\n"; printMatrix(matrix, n); rotateMatrix(matrix, n); cout << "\nRotated Matrix:\n"; printMatrix(matrix, n); return 0; }
Output:
Original Matrix: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Rotated Matrix: 13 9 5 1 14 10 6 2 15 11 7 3 16 12 8 4
Explanation:
This method works by:
- Dividing the matrix into concentric layers (like an onion)
- For each layer, rotating elements in groups of four
- Moving elements from top → right → bottom → left → top
- Working from the outermost layer inward
Key steps in the rotation:
- Save the top element
- Move left element to top position
- Move bottom element to left position
- Move right element to bottom position
- Move saved top element to right position