题目:
输入一个数字构成的矩形, 将矩形的值进行90度旋转后打印
输入:
第一行 正整数n(1<n<10), 表示矩阵的边长
随后输入一个矩阵
输出:
90度旋转后的矩阵
样例输入:
3
1 2 3
4 5 6
7 8 9
样例输出:
7 4 1
8 5 2
9 6 3
逻辑如下:
-
import java.util.Scanner;
:这行代码导入Scanner
类,它用于从标准输入(通常是键盘)读取数据。 -
public class Main { ... }
:这是Java程序的入口点,Main
是类的名称。 -
public static void main(String[] args) { ... }
:这是Java程序的主方法,是程序执行的开始。 -
Scanner sc = new Scanner(System.in);
:创建一个Scanner
对象sc
来读取输入。 -
System.out.print("请输入正整数n(1<n<10):");
:输出提示信息,要求用户输入矩阵的边长n
。 -
int n = sc.nextInt();
:读取一个正整数n
,它表示矩阵的边长。 -
int[][] arrInput = new int[n][n];
:初始化一个n
xn
的二维整数数组arrInput
,用于存储输入的矩阵。 -
int[][] arrOutput = new int[n][n];
:初始化另一个n
xn
的二维整数数组arrOutput
,用于存储旋转后的矩阵。 -
接下来的嵌套循环用于读取矩阵的每个元素。
System.out.print("请输入矩阵数值:");
是提示用户输入矩阵数值的信息。 -
读取输入的矩阵后,接下来的嵌套循环用于执行旋转操作。旋转的规则是将原矩阵的行变为新矩阵的列,并且列的顺序反转,即原矩阵的
arrInput[i][j]
变为新矩阵的arrOutput[j][n-1-i]
。 -
System.out.println("输出矩阵为:");
:输出提示信息,表示接下来将打印旋转后的矩阵。 -
最后的嵌套循环用于输出旋转后的矩阵。每个元素之间用空格分隔,每打印完一行后换行。
为什么用arrOutput[j][n-1-i]=arrInput[i][j];来扭转90°呢?
要理解为什么使用 arrOutput[j][n-1-i] = arrInput[i][j];
来旋转矩阵,我们需要了解二维数组在内存中的布局以及旋转矩阵的几何意义。
在一个二维数组中,元素是按行优先的顺序存储的。例如,对于一个3x3的矩阵,其元素在内存中的顺序是这样的:
[0,0] [0,1] [0,2]
[1,0] [1,1] [1,2]
[2,0] [2,1] [2,2]
当我们说将矩阵旋转90度时,我们实际上是在做以下操作:
- 原矩阵的行变为旋转后矩阵的列。
- 原矩阵的列变为旋转后矩阵的行,但是顺序是反的。
例如,对于一个3x3的矩阵:
1 2 3
4 5 6
7 8 9
旋转90度后,它应该看起来像这样:
7 4 1
8 5 2
9 6 3
可以看到,第一行变成了最右边的一列,第二行变成了中间的一列,第三行变成了最左边的一列,并且每一列的顺序是从下到上。
现在,让我们来看看 arrOutput[j][n-1-i] = arrInput[i][j];
这行代码是如何实现这个旋转的:
arrInput[i][j]
表示原矩阵中的元素。arrOutput[j][n-1-i]
表示旋转后矩阵中的元素。
在这里,i
和 j
分别是原矩阵的行和列索引。在旋转后的矩阵中,i
变成了列索引(因为原矩阵的行变成了旋转后矩阵的列),而 j
变成了行索引(因为原矩阵的列变成了旋转后矩阵的行,但是顺序是反的,所以用 n-1-i
来表示反向的行索引)。
通过这种方式,我们就可以通过一行代码将整个矩阵旋转90度
完整代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入正整数n(1<n<10):");
int n = sc.nextInt();
int[][] arrInput=new int[n][n];
int[][] arrOutput=new int[n][n];
//输入矩阵
System.out.print("请输入矩阵数值:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arrInput[i][j]=sc.nextInt();
}
}
//旋转90度矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arrOutput[j][n-1-i]=arrInput[i][j];
}
}
//输出矩阵
System.out.println("输出矩阵为:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(arrOutput[i][j]+" ");
}
System.out.println();
}
}
}