【Java基础题】90°旋转矩阵的问题解析

题目:

输入一个数字构成的矩形, 将矩形的值进行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

逻辑如下:

  1. import java.util.Scanner;:这行代码导入Scanner类,它用于从标准输入(通常是键盘)读取数据。

  2. public class Main { ... }:这是Java程序的入口点,Main是类的名称。

  3. public static void main(String[] args) { ... }:这是Java程序的主方法,是程序执行的开始。

  4. Scanner sc = new Scanner(System.in);:创建一个Scanner对象sc来读取输入。

  5. System.out.print("请输入正整数n(1<n<10):");:输出提示信息,要求用户输入矩阵的边长n

  6. int n = sc.nextInt();:读取一个正整数n,它表示矩阵的边长。

  7. int[][] arrInput = new int[n][n];:初始化一个n x n的二维整数数组arrInput,用于存储输入的矩阵。

  8. int[][] arrOutput = new int[n][n];:初始化另一个n x n的二维整数数组arrOutput,用于存储旋转后的矩阵。

  9. 接下来的嵌套循环用于读取矩阵的每个元素。System.out.print("请输入矩阵数值:");是提示用户输入矩阵数值的信息。

  10. 读取输入的矩阵后,接下来的嵌套循环用于执行旋转操作。旋转的规则是将原矩阵的行变为新矩阵的列,并且列的顺序反转,即原矩阵的arrInput[i][j]变为新矩阵的arrOutput[j][n-1-i]

  11. System.out.println("输出矩阵为:");:输出提示信息,表示接下来将打印旋转后的矩阵。

  12. 最后的嵌套循环用于输出旋转后的矩阵。每个元素之间用空格分隔,每打印完一行后换行。

为什么用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();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七洛殇Atrosenet.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值