栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【算法java版04】:顺时针方向循环输出矩阵

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【算法java版04】:顺时针方向循环输出矩阵

顺时针方向循环输出矩阵
    • 一、题目描述
    • 二、实现思路
    • 三、代码示例
    • 四、测评结果
      • (1)4 x 4 矩阵:
      • (2)3 x 3 矩阵:


一、题目描述

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

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

二、实现思路

  • 如上图所示,整体上是由外到内进行顺时针循环遍历,我们可以将遍历过程分为四部分,分别是:
    从左到右、从上到下、从右到左,从下到上。
  • 矩阵分为行和列,我们可以定义四个变量分别来保存矩阵行和列的起点和终点,如上图所示的,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;


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 矩阵:

(2)3 x 3 矩阵:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/511249.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号