首页 > 解决方案 > 如何旋转矩阵?C

问题描述

我想要一个矩阵向右旋转。它适用于方阵,但我也应该适用于非方阵。

我尝试旋转它,但我想不出一种方法让它适用于非方阵。

#include <stdio.h>

#define x 7
#define y 7

int build() {
    int i = 0, k = 0;
    int matrix[x][y];

    for (i = 0; i < x; ++i) {
        for (k = 0; k < y; ++k) {
            matrix[i][k] = i;
        }
    }
    for (i = 0; i < x; ++i) {
        for (k = 0; k < y; ++k) {
            printf("\t%d", matrix[k][i]);
        }
        printf("\n");
    }
    return matrix[i][k];
}

int turn() 
{
    int i = 0, k = 0;
    int matrix[x][y];

    for (i = 0; i < x; ++i) {
        for (k = 0; k < y; ++k) {
            matrix[i][k] = i;
        }
    }
    for (i = 0; i < x; ++i) {
        for (k = 0; k < y; ++k) {
            printf("\t%d", matrix[i][k]);
        }
        printf("\n");
    }
}

int main()
{
    build();
    printf("\t\n");
    turn();
}

我希望它适用于 x=5 和 y=7 等不同的变量。

我的想法是将矩阵旋转 90 度。

0 0 0 0

1 1 1 1

2 2 2 2

2 1 0

2 1 0

2 1 0

2 1 0

标签: carrays

解决方案


80% 的工作是声明你的函数并理解声明的含义。你可以这样开始:

#define x 5
#define y 7

void build(int output[y][x]);

这声明了一个函数build,它接收一个矩阵,并用所需的数据填充它。注意:它不返回任何东西(即返回void);它不是返回数据,而是接收它应该写入的指针。这是 C 中的标准做法,因为您不能从函数返回数组。

我还没有为它编写代码,因为它会分散你对程序中信息流的理解:

int main()
{
    int matrix_before_rotation[y][x];
    build(matrix_before_rotation);
}

这个假设的程序使用您的函数用值填充矩阵。它不会打印它,但如果您使用例如调试器,您可以看到这些值。

声明一个进行旋转的函数:

void turn(int input[y][x], int output[x][y]);

请注意维度的差异,以及函数接收两个参数的事实——一个用于输入,一个用于输出。您需要在主程序中分配两个矩阵:

int main()
{
    int matrix_before_rotation[y][x];
    int matrix_after_rotation[x][y];
    build(matrix_before_rotation);
    turn(matrix_before_rotation, matrix_after_rotation);
}

鉴于这种代码结构,很容易填写实现细节。

您可能希望在调试程序时添加一个用于打印矩阵的函数:

#define x 5
#define y 7

void build(int output[y][x]);
void turn(int input[y][x], int output[x][y]);
void print(int height, int width, int input[height][width]);

int main()
{
    int matrix_before_rotation[y][x];
    int matrix_after_rotation[x][y];
    build(matrix_before_rotation);
    print(y, x, matrix_before_rotation);
    turn(matrix_before_rotation, matrix_after_rotation);
    print(x, y, matrix_after_rotation);
}

注意:打印函数比生成函数和旋转函数更通用——它知道如何处理任何维度的矩阵。您需要它是因为您的新程序中至少需要两种类型的矩阵 - [7][5] 和 [5][7]。您可以使用这个想法来概括您的旋转函数,以便它可以处理任何维度的矩阵。


推荐阅读