顺时针方向循环输出矩阵

  • 一、题目描述
  • 二、实现思路
  • 三、代码示例
  • 四、测评结果
  • (1)4 x 4 矩阵:
  • (2)3 x 3 矩阵:



一、题目描述

使用二维数组构建一个矩阵,按照顺时针方向循环输出矩阵内的元素。

如下图所示的矩阵的顺时针方向循环输出的结果为:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10

Java矩阵顺时针选择九十度 顺时针输出矩阵java_算法

二、实现思路

Java矩阵顺时针选择九十度 顺时针输出矩阵java_java_02

  • 如上图所示,整体上是由外到内进行顺时针循环遍历,我们可以将遍历过程分为四部分,分别是:
    从左到右、从上到下、从右到左,从下到上。
  • 矩阵分为行和列,我们可以定义四个变量分别来保存矩阵行和列的起点和终点,如上图所示的,left、top、right、bottom
  • 首先从左到右遍历,此时在从左到右遍历的一个周期内只有列在增加,而行不发生变化,直到一个遍历周期结束了,行
    的起点自加一,当行的起点大于行的终点时退出循环。
// 从左到右
for (int i = left; i < right; i++) {
    System.out.print(arr[top][i] + "  ");
}
top++; // 行的遍历起点加一
if (top > bottom) {  // 如果 行的起点 大于 行的终点则退出循环遍历
    break;
}
  • 然后从上到下遍历,此时在从上到下遍历的一个周期内只有行在增加,而列不发生变化,直到一个遍历周期结束了,列
    的终点自减一,当列的起点大于列的终点时退出循环。
// 从上到下
for (int i = top; i < bottom; i++) {
    System.out.print(arr[i][right - 1] + "  ");
}
right--;   // 列的遍历终点减一
if (left > right) {  //如果 列的起点 大于 列的终点则退出循环
    break;
}
  • 接着从右到左遍历,此时在从右到左遍历的一个周期内只有列在减小,而行不发生变化,直到一个遍历周期结束了,行的终点自减一,当行的终点小于行的起点时退出循环。
// 从右到左
for (int i = right - 1; i >= left; i--) {
     System.out.print(arr[bottom - 1][i] + "  ");
}
bottom--;  // 行的遍历终点减一
if(top > bottom){  //如果 行的起点 大于 行的终点则退出循环
     break;
}
  • 最后从下到上遍历,此时在从下到上遍历的一个周期内只有行在减小,而列不发生变化,直到一个遍历周期结束了,列的终点自减一,当列的终点小于列的起点时退出循环
// 从下到上
for(int i = bottom - 1;i>=top;i--){
    System.out.print(arr[i][left] + "  ");
}
left++;  // 列的遍历起点加一
if(left > right){  //如果 列的起点 大于 列的终点则退出循环
    break;
}
  • 补充:之所以在循环遍历时要进行 行 和 列 的加减变化,是为了实现矩阵从外到内循环遍历这一目的。

三、代码示例

package com.easy.java;

/**
 * @ClassName Test05
 * @Description 顺时针循环输出矩阵
 * @Author wk
 * @Date 2021/11/14 22:31
 * @Version 1.0
 */
public class Test05 {
    public static void main(String[] args) {
        int arr[][] = new int[4][4];
        int count = 1;
        //初始化数组
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                arr[i][j] = count;
                count++;
                System.out.print(arr[i][j] + "  ");
            }
            System.out.println();
        }
        System.out.println();
        //循环输出
        int left = 0; // 列的起点
        int right = arr[0].length; // 列的终点
        int top = 0;  // 行的起点
        int bottom = arr.length;  // 行的终点
        while (true) {
            // 从左到右
            for (int i = left; i < right; i++) {
                System.out.print(arr[top][i] + "  ");
            }
            top++;
            if (top > bottom) {
                break;
            }
            // 从上到下
            for (int i = top; i < bottom; i++) {
                System.out.print(arr[i][right - 1] + "  ");
            }
            right--;
            if (left > right) {
                break;
            }
            // 从右到左
            for (int i = right - 1; i >= left; i--) {
                System.out.print(arr[bottom - 1][i] + "  ");
            }
            bottom--;
            if(top > bottom){
                break;
            }
            // 从下到上
            for(int i = bottom - 1;i>=top;i--){
                System.out.print(arr[i][left] + "  ");
            }
            left++;
            if(left > right){
                break;
            }
        }
    }
}

四、测评结果

(1)4 x 4 矩阵:

Java矩阵顺时针选择九十度 顺时针输出矩阵java_矩阵_03

(2)3 x 3 矩阵:

Java矩阵顺时针选择九十度 顺时针输出矩阵java_java_04