2017-06-12 220 views
1

說我有多維數組是這樣的:旋轉陣列順時針

int arr[3][3] = {{1, 2, 3}, 
       {4, 5, 6}, 
       {7, 8, 9}}; 

我想陣列順時針旋轉,所以它看起來是這樣的:

{{7, 4, 1}, 
{8, 5, 2}, 
{9, 6, 3}}; 

我試圖交換各自的值依次與之前的值:

swap(&arr[0][0],&arr[0][1]); 
    swap(&arr[0][1],&arr[0][2]); 
    swap(&arr[0][2],&arr[1][2]); 
    swap(&arr[1][2],&arr[2][2]); 
    swap(&arr[2][2],&arr[2][1]); 
    swap(&arr[2][1],&arr[2][0]); 
    swap(&arr[2][0],&arr[1][0]); 
    swap(&arr[1][0],&arr[0][0]); 

這沒有正確旋轉。它留下了一些值,並將其他人放在錯誤的地方。

我在做什麼錯,我該如何做到這一點?

+1

@DavidBowling固定。 – DEADBEEF

+0

類似[問題](https://stackoverflow.com/questions/40832947/array-rotation-in-c/) – BLUEPIXY

+0

什麼是'swap'?你應該顯示你的代碼,並且最好發佈一個[MCVE](http://stackoverflow.com/help/mcve) –

回答

2

您不需要八次交換來旋轉矩陣,因爲最後兩次交換將兩個項目放在他們的位置。額外的掉期將他們的操作數再次置於錯誤的位置。

中心項目留在它的位置。前四次互換在他們的新地點放置了四件物品;最後兩對互相交換新的位置,所以只有兩次交換足以完成輪換。

swap(&arr[0][0], &arr[2][0]); 
swap(&arr[0][1], &arr[1][0]); 
swap(&arr[0][2], &arr[2][0]); 
swap(&arr[1][0], &arr[2][1]); 
swap(&arr[1][2], &arr[2][1]); 
swap(&arr[2][2], &arr[2][0]); 

Demo.

+0

謝謝!出於好奇,我會如何逆時針旋轉它,只是將代碼逆轉? – DEADBEEF

+0

您可以在每行代碼上交換數組索引;例如[2] [0]會變成[0] [2]。 [在線試用!(https://tio.run/##hVHbToQwFHym[email protected]nfI9Xo9tXtR3n28M7Lsuchx/[email protected][email protected]zWhmnrSoHD3j8qZpQ[email protected]@[email protected]​​9ltq3J1XBpx87DL8 「C(GCC) - 在線試用」) – musicman523

+0

@heythere奇怪的是,最後兩條線是相同的。前四個做改變,從對面挑選物品。這是[修改的演示](http://ideone.com/uQLKpu)。 – dasblinkenlight

2

您可能會注意到,旋轉後,旋轉陣列的第一行的元素來自原數組的第一列,按相反的順序相對於指數。同樣,旋轉數組的第二行來自原始數組的第二列,依此類推。考慮到這一點,可以在將新值複製到原始數組之前,編寫一個函數,使用原始數組中的適當值填充新數組。

函數rotate_array()遍歷數組rotatedirotated行的元素來自輸入數組ai列。 irotated行的j th元素是ai第012列的n-j-1 th元素。然後使用memcpy()函數將旋轉數組的內容複製到原始數組中。

#include <stdio.h> 
#include <string.h> 

void print_array(size_t n, int a[n][n]); 
void rotate_array(size_t n, int a[n][n]); 

int main(void) 
{ 
    size_t arr_sz = 5; 
    int arr[arr_sz][arr_sz]; 

    for (size_t i = 0; i < arr_sz; i++) { 
     for (size_t j = 0; j < arr_sz; j++) { 
      arr[i][j] = i * arr_sz + j + 1; 
     } 
    } 

    puts("Before rotation:"); 
    print_array(arr_sz, arr); 
    putchar('\n'); 

    rotate_array(arr_sz, arr); 
    puts("After rotation:"); 
    print_array(arr_sz, arr); 
    putchar('\n'); 

    return 0; 
} 

void print_array(size_t n, int a[n][n]) 
{ 
    for (size_t i = 0; i < n; i++) { 
     for (size_t j = 0; j < n; j++) { 
      printf("%5d", a[i][j]); 
     } 
     putchar('\n'); 
    } 
} 

void rotate_array(size_t n, int a[n][n]) 
{ 
    int rotated[n][n]; 
    for (size_t i = 0; i < n; i++) { 
     for (size_t j = 0; j < n; j++) { 
      rotated[i][j] = a[n - j - 1][i]; 
     } 
    } 
    memcpy(a, rotated, sizeof a[0][0] * n * n); 
} 
Before rotation: 
    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 

After rotation: 
    21 16 11 6 1 
    22 17 12 7 2 
    23 18 13 8 3 
    24 19 14 9 4 
    25 20 15 10 5