当前位置: 首页 > 知识库问答 >
问题:

顺时针旋转数组

孙承
2023-03-14

假设我有这样的多维数组

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个答案

任繁
2023-03-14

您可能会注意到,旋转后,旋转数组第一行的元素来自原始数组的第一列,与索引的顺序相反。同样,旋转数组的第二行来自原始数组的第二列,依此类推。考虑到这一点,您可以编写一个函数,在将新值复制到原始数组之前,用原始数组中的适当值填充新数组。

函数rotate_array()迭代数组rotated。旋转的I第1行的元素来自输入数组AI第1列。I第1行的J第1个元素是A第1列的N-J-1第1个元素。然后使用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
 类似资料:
  • 预期的结果是逆时针旋转字节数组,以获得一个固定的“a”。 我试图将给定的数组转换为旋转版本,但效果不佳。我的代码在“loop()”中的位移位和计算部分有一些不正确的地方。因此,我不得不分别处理x==5和x==6。 我如何在C中以更一般的方式逆时针旋转字节数组? 代码: 输出LED:

  • 我有一个图像视图和一个按钮,我想要什么,当我点击按钮我想旋转图像视图10度。请帮帮我。 下面是我使用的代码

  • 本文向大家介绍写一个算法,可以将一个二维数组顺时针旋转90度,说一下思路。相关面试题,主要包含被问及写一个算法,可以将一个二维数组顺时针旋转90度,说一下思路。时的应答技巧和注意事项,需要的朋友参考一下 考察点:数组    

  • 问题内容: 我想找出悬停时如何制作 旋转或旋转的图像 。我想知道如何在以下代码上使用 CSS 模仿该功能: 问题答案: 您可以将CSS3过渡与一起使用,以 在悬停时旋转图像 。 旋转图像:

  • 问题内容: 因此,目标是将阵列中的元素正确旋转一次。举个例子; 如果, 则将成为 这是我所拥有的: 但是,这无法说明何时大于数组的长度。我读到我应该将更大的存储在另一个Array中,但是看到变量是不确定的,因此我不确定这是最好的解决方案。提前致谢。 问题答案: 在代码中添加一个模数组长度: 您还应该创建一个要复制到的新值,以免覆盖以后需要的值。

  • 问题内容: 是否可以轻松地“旋转” PHP中的数组? 像这样:1,2,3,4-> 2,3,4,1 为此有某种内置的PHP函数吗? 问题答案: 当前大多数答案都是正确的,但前提是您不关心索引: 输出: 要保留索引,您可以执行以下操作: 输出: 也许有人可以比我的四行方法更简洁地进行轮换,但这还是行得通的。