目录
一、问题描述
问题:
1.将一个n阶方阵按顺时针方向旋转90度。
2.将一个n阶方阵进行转置。
实例:
1 2 3
4 5 6
7 8 9
按顺时针旋转90度后方阵为:
7 4 1
8 5 2
9 8 3
转置后的方阵为:
1 4 7
2 5 8
3 6 9
输入:
3
1 2 3
4 5 6
7 8 9
输出:
7 4 1
8 5 2
9 8 3
1 4 7
2 5 8
3 6 9
二、问题求解
(1)方阵顺时针旋转(以3阶方阵为例)
问题分析:
对于矩阵等二维方向上的数字变化问题的求解,最主要的是找到其中的位置变化规律。
①方阵的位置表示如下:
[0,0] [0,1] [0,2]
[1,0] [1,1] [1,2]
[2,0] [2,1] [2,2]
②方阵旋转90度后的位置变化
[2,0] [1,0] [0,0]
[2,1] [1,1] [0,1]
[2,2] [1,2] [0,2]
根据上述的位置变化可知:方阵旋转90度后,每一行的列号不变,并向下逐次递加1;每一行的行号从左往右依次递减。由于在同一个方阵上修改,是逐行从左往右依次修改,所以前面修改的值必然会对后面的值产生影响,所以,需要借助一个辅助矩阵。
程序设计:
#include <stdio.h>
int main() {
int n;
int a[10][10];
int b[10][10];
//输入阶数
scanf("%d", &n);
//输入方阵的值
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
//方阵顺时针变化
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
b[i][j] = a[n - j - 1][i];
}
}
//方阵打印
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
//printf("%-3d", b[i][j]);
printf("%-3d", a[i][j]);
}
printf("\n");
}
}
运行调试结果:
(2)方阵转置(以3阶方阵为例)
问题分析:
①方阵的位置表示如下:
[0,0] [0,1] [0,2]
[1,0] [1,1] [1,2]
[2,0] [2,1] [2,2]
②方阵转置的位置变化
[0,0] [1,0] [0,0]
[0,1] [1,1] [2,1]
[0,2] [1,2] [2,2]
根据上述的位置变化可知:方阵转置后,主对角线(从左上角到右下角)上的数字位置没有变化,其他位置数字的位置变化是行列号对调。
程序设计:
#include <stdio.h>
int main() {
int n;
int a[10][10];
int b[10][10];
//输入阶数
scanf("%d", &n);
//输入方阵的值
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
//方阵转置
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
b[i][j] = a[j][i];
}
}
//方阵打印
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%-3d", b[i][j]);
}
printf("\n");
}
}
运行调试结果: