矩阵旋转
【问题描述】
输入矩阵阶数n,给n阶矩阵的元素按行序由1到n*n顺序赋值,然后将其向右旋转90度,输出旋转后的矩阵。
【输入形式】
控制台输入阶数n。
【输出形式】
输出旋转90度后的矩阵,其中每个数字占4位字符的宽度,向右对齐。
【样例输入】
4
【样例输出】
13 9 5 1 14 10 6 2 15 11 7 3 16 12 8 4
#include <stdio.h>
// 交换两个整数的函数
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 转置矩阵(行列互换)
void transpose(int matrix[][100], int n) {
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
swap(&matrix[i][j], &matrix[j][i]);
}
}
}
// 水平翻转矩阵
void reverseRows(int matrix[][100], int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n / 2; j++) {
swap(&matrix[i][j], &matrix[i][n - j - 1]);
}
}
}
int main() {
int n;
scanf("%d", &n);
int matrix[100][100];
// 按行序给矩阵元素赋值
int num = 1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = num++;
}
}
// 先转置矩阵
transpose(matrix, n);
// 再水平翻转矩阵,实现向右旋转90度的效果
reverseRows(matrix, n);
// 按格式输出旋转后的矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%4d", matrix[i][j]);
}
printf("\n");
}
return 0;
}
1. swap
函数
展开过程
这个函数用于交换两个整数的值,它接受两个指向整数的指针作为参数,通过借助一个临时变量 temp
来实现两个指针所指向整数的交换,在后续转置矩阵和水平翻转矩阵的操作中会频繁用到这个函数来交换元素的值。
2. transpose
函数
展开过程
该函数的作用是对给定的矩阵进行转置操作,即将矩阵的行和列进行互换。通过两层嵌套的 for
循环遍历矩阵,注意内层循环的起始条件是 j = i + 1
,这是为了避免重复交换已经交换过的元素(例如,在交换 matrix[0][1]
和 matrix[1][0]
后,就不需要再重复交换它们了),在循环内部使用 swap
函数交换 matrix[i][j]
和 matrix[j][i]
的值,实现转置的效果。这里假设矩阵最大维度为 100(所以函数参数中二维数组第二维写成 [100]
),实际应用中可根据需求调整这个值。
3. reverseRows
函数
展开过程
这个函数用于对矩阵的每一行进行水平翻转操作。外层 for
循环遍历矩阵的每一行,内层 for
循环针对每一行,通过交换该行的对称位置的元素来实现水平翻转,循环条件 j < n / 2
是因为只需要交换一半的元素就能实现整行的翻转(例如,对于一行有 5 个元素的情况,交换第 0 个和第 4 个元素,第 1 个和第 3 个元素即可完成翻转),在循环中同样使用 swap
函数来交换对应元素的值。
4. main
函数主体部分
- 矩阵初始化:
展开过程
首先从控制台读取输入的矩阵阶数 n
,然后定义一个二维数组 matrix
用于存储矩阵元素(同样假设最大维度为 100,可按需调整)。接着通过两层嵌套的 for
循环,按照行序给矩阵元素依次赋值,从 1 开始每次递增 1,直到填满整个 n
阶矩阵。
- 矩阵旋转操作:
展开过程
按照矩阵旋转 90 度的数学原理,先对原始矩阵进行转置操作(调用 transpose
函数),然后再对转置后的矩阵进行水平翻转操作(调用 reverseRows
函数),这样就实现了将矩阵整体向右旋转 90 度的效果。
- 输出旋转后的矩阵:
展开过程
通过两层嵌套的 for
循环遍历旋转后的矩阵,使用 printf
函数按照每个数字占 4 位字符宽度且向右对齐的格式要求输出矩阵元素,每输出完一行元素后输出一个换行符 \n
,使得输出的矩阵格式整齐美观,符合题目要求。