如何將N×N矩陣旋轉90度。我想要它在現場?如何將N×N矩陣旋轉90度?
回答
for(int i=0; i<n/2; i++)
for(int j=0; j<(n+1)/2; j++)
cyclic_roll(m[i][j], m[n-1-j][i], m[n-1-i][n-1-j], m[j][n-1-i]);
void cyclic_roll(int &a, int &b, int &c, int &d)
{
int temp = a;
a = b;
b = c;
c = d;
d = temp;
}
注意我沒有測試過這,現在就在現場進行組合。在做任何事情之前請先測試一下。
你能解釋一下你是如何提出索引的? – 2010-05-23 19:38:37
解釋索引..好吧,想一想旋轉90度時(i,j)處的位置。想象一下picutre。 (i,j) - >(end-j,i)。原來的距離遠離左側,遠離矩陣底部的左側。 – 2010-05-23 19:42:23
如果逆時針旋轉,則映射爲[p] [k]→a [N-1-k] [p]→a [N-1-p] [N-1-k] - > a [k] [N-1-p]。我認爲在我的限制中也有一個錯誤。它應該是i
您可以創建第二個數組,然後將第一個數組複製到第二個數組中,方法是讀取第一個數組中的row-major並將column-major寫入第二個數組中。
所以,你會複製:
1 2 3
4 5 6
7 8 9
,你會讀,然後在第一行寫回了首發,如:
3
2
1
這是我的溶液: (旋轉PI/2的順時針方向)
做陣列的轉置,(如矩陣轉置)
反向每行
元素cons int row = 10; cons int col = 10; //transpose for(int r = 0; r < row; r++) { for(int c = r; c < col; c++) { swap(Array[r][c], Array[c][r]); } } //reverse elements on row order for(int r = 0; r < row; r++) { for(int c =0; c < col/2; c++) { swap(Array[r][c], Array[r][col-c-1]) } }
if if pi/2逆時針旋轉
轉置陣
逆轉列順序
從未測試代碼的元素! 任何建議,將不勝感激!
每個元素將被移動兩次(與@Pavel Radzivilovsky的答案中的1.25倍相比),所以效率較低。 「上行」是因爲不需要'int temp',內存需求減少了全部四個字節...... – 2011-08-03 06:18:35
與@ Jean-FrançoisCorbett一致認爲不如其他ans有效。但是,這個確實很簡單。其實,我也執行了相同的算法! – MalTec 2012-07-28 19:55:08
謝謝,這大大簡化了解決方案 – 2015-03-15 13:13:30
一個完整的C程序,說明了我的方法。本質上它是遞歸算法。在每次遞歸時,旋轉外層。當你的矩陣是1x1或0x0時停止。
#include <stdio.h>
int matrix[4][4] = {
{11, 12, 13, 14},
{21, 22, 23, 24},
{31, 32, 33, 34},
{41, 42, 43, 44}
};
void print_matrix(int n)
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf(" %d ", matrix[i][j]);
}
printf("\n");
}
}
int *get(int offset, int x, int y)
{
return &matrix[offset + x][offset + y];
}
void transpose(int offset, int n)
{
if (n > 1) {
for (int i = 0; i < n - 1; i++) {
int *val1 = get(offset, 0, i);
int *val2 = get(offset, i, n - 1);
int *val3 = get(offset, n - 1, n - 1 - i);
int *val4 = get(offset, n - 1 - i, 0);
int temp = *val1;
*val1 = *val4;
*val4 = *val3;
*val3 = *val2;
*val2 = temp;
}
transpose(offset + 1, n - 2);
}
}
main(int argc, char *argv[])
{
print_matrix(4);
transpose(0, 4);
print_matrix(4);
return 0;
}
//Java version, fully tested
public class Rotate90degree {
public static void reverseElementsRowWise(int[][] matrix) {
int n = matrix.length;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n/2; ++j) {
int temp = matrix[i][n - j - 1];
matrix[i][n - j - 1] = matrix[i][j];
matrix[i][j] = temp;
}
}
}
public static void transpose(int[][] matrix) {
int n = matrix.length;
for(int i = 0; i < n; ++i) {
for(int j = i + 1; j < n; ++j) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
public static void rotate90(int[][] matrix) {
transpose(matrix);
reverseElementsRowWise(matrix);
}
public static void print(int[][] matrix) {
int n = matrix.length;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
System.out.print(matrix[i][j]);
System.out.print(' ');
}
System.out.println();
}
}
public static void main(String[] args) {
int[][] matrix = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}};
System.out.println("before");
print(matrix);
rotate90(matrix);
System.out.println("after");
print(matrix);
}
}
- 1. 90 * n度旋轉矩陣CW
- 2. 旋轉M * N矩陣(90度)
- 3. 瞭解如何旋轉矩陣90度
- 4. 如何將M×N矩陣180度旋轉到位?
- 5. 將矩陣內的矩陣旋轉90度
- 6. 旋轉PDF文件n度,其中n不是90的倍數
- 7. 如何將3D矩陣逆時針旋轉90度?
- 8. 如何矩陣矩陣轉換(N)(1,N)基體在python
- 9. 要將m×n矩陣轉換爲1×n矩陣
- 10. 矩形旋轉90度libgdx
- 11. deteminant N * N矩陣
- 12. Java - 如何旋轉矩陣小於90度
- 13. 將2D像素陣列旋轉90度
- 14. 將NxN矩陣旋轉90度後的邏輯錯誤
- 15. 如何使用Python生成隨機N維旋轉矩陣?
- 16. 如何從n維矩陣得到n維二維子矩陣?
- 17. 如何通過n矩陣每n由M矩陣
- 18. 新矩陣[N] [N]失敗
- 19. 如何旋轉TeeChart 90度
- 20. 如何旋轉StageVideo 90度
- 21. 如何將輸出旋轉90度?
- 22. 如何將多個時間矩陣(N * N)傳遞給optaplanner
- 23. Matlab循環將N×1矩陣轉換爲60×4718矩陣
- 24. N * N矩陣,計數唯一矩形矩陣的數量。
- 25. 旋轉矩陣/圖像的公式90度C++
- 26. 旋轉CALayer 90度?
- 27. 旋轉臺90度
- 28. CGAffineTransform旋轉90度
- 29. 2x2旋轉矩陣(45度)
- 30. 如何將3x3旋轉矩陣轉換爲4x4矩陣?
重複的[你如何旋轉一個二維數組?](http://stackoverflow.com/questions/42519/how-do-you-rotate-a-two-dimensional-array )(這些解決方案中的代碼大多不是C++,但算法非常簡單,在大多數情況下轉換爲C++應該是微不足道的) – 2010-05-23 19:29:20
這取決於矩陣如何存儲在數據結構中。你試過什麼了? – 2010-05-23 19:29:37
順時針還是逆時針? – 2010-05-23 19:31:01