Leetcode順時鐘旋轉90度

問題
You are given an n x n 2D matrix representing an image.
Rotate the image by 90 degrees (clockwise).
Follow up:
Could you do this in-place?

結合查找到的資料做個總結。
1. 對角交換+以中間線左右交換


觀察交換前後數組關係,發現:
原數組第一行變成新數組最右邊一列
原數組第二行變成新數組最右邊第二列
……

那麼代碼就簡單,見最後附錄代碼。

2. 四元組爲單位旋轉

分析數組,發現規律:
a[i][j] = a[n-1-j][i](左邊指旋轉後元素)



使用快捷鍵:
對於數組,終止條件爲:
i<n/2
j>=i && j<n-i-1

源代碼
/* Copright Reserved by MiracleCoder
* No permit to delete the link: http://blog.csdn.net/idc_void
*/
#define N 4
void PrintMatrix( int m[N][N], const char *str )
{
cout << str << endl;
for ( int i = 0; i < N; ++i )
{
for ( int j = 0; j < N; ++j )
{
cout << m[i][j] << "\t";
}
cout << endl;
}
}
void Rotate( int matrix[N][N])
{
if( matrix == NULL )
return;
// print
PrintMatrix( matrix, "Before");
for ( int i = 0; i < N; ++i )
{
for ( int j = 0; j < i; ++j ) // Condition: j < i
swap( matrix[i][j], matrix[j][i]);
}
for ( int i = 0; i < N; ++i )
{
for ( int j = 0; j < N/2; ++j ) // 次數確定:每次減兩個,直到只剩下一個或者零個
swap( matrix[i][j] , matrix[i][N-j-1] );
}
// print
PrintMatrix( matrix, "After rotate 90 degree\n");
}
void Rotate90Degree( int matrix[N][N] )
{
// print
PrintMatrix( matrix, "Before");
for ( int i = 0; i < N/2; ++i )
{
for( int j = i; j < N - 1 - i; ++j ){
int value = matrix[i][j];
matrix[i][j] = matrix[N-1-j][i];
matrix[N-1-j][i] = matrix[N-i-1][N-1-j];
matrix[N-i-1][N-1-j] = matrix[j][N-i-1];
matrix[j][N-i-1] = value;
}
}
PrintMatrix( matrix, "After rotate 90 degree\n");
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章