2017-06-12 172 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