c - 如何旋转矩阵?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
解决方案
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]。您可以使用这个想法来概括您的旋转函数,以便它可以处理任何维度的矩阵。
推荐阅读
- websocket - lighttpd/mod_wstunnel 连接 JSON 消息
- arrays - 在 Typescript 中定义动态数组?
- python - Ctypes __readgsqword
- reactjs - 如何显示从 mongodb 检索到的由 URL.createObjectURL 保存的图像?
- php - php 文件如何保存 jquery ajax POST 接收的文件?
- c# - 什么是函数评估需要所有线程运行?
- c# - 我可以从现有的 DbContext 克隆吗?
- c# - 将事件链接到依赖项?
- c++ - 通过拆分将 char* 转换为字符串数组
- r - 在 R 中创建具有额外行和列信息的矩阵