博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转圈打印矩阵(二维数组)中的元素
阅读量:4040 次
发布时间:2019-05-24

本文共 4336 字,大约阅读时间需要 14 分钟。

转圈打印矩阵(二维数组)中的元素

如图所示,假设给定一个N*N (N=4)的矩阵并且初始值左图中单元格所示,要求按照右图所示的情况打印矩阵元素。

转圈打印矩阵

算法分析

定义4个变量top、bottom、left、right分别控制元素坐标位置。

初始化时:top = 0;left = 0 ;bottom = n-1;right = n-1。

转圈打印的方向是顺时针:

从左向右;从上向下;从右向左;在从下向上。

声明一个二维数组 array具有N行N列

声明一个变量 num=1 n u m = 1

从左向右,从上向下:当 left<=right l e f t <= r i g h t 并且 top<=bottom t o p <= b o t t o m 时满足打印条件

从左向右: left++ l e f t + +

从上向下: top++ t o p + +
从右向左: right r i g h t − −
从下向上: bottom b o t t o m − −

算法设计参考下面代码的注释,while循环中是按照从左向右,从上向下,从右向左,从下向上的顺序转圈赋值。

public static int[][] generateMatrix(int n) {        int[][] rs = new int[n][n];        int top = 0,bottom = n-1,left = 0,right = n-1;        int num = 1;        //边界条件是 left<=right 同时 top<=bottom        while(left<=right && top <=bottom){            /*             * 从左向右             * 初次,当left=0时,rs[top][i]表示第一行的元素,             * i=left=0;赋值之后 i++,表示从第一行第一列的元素到第一行最后一个元素依次赋值,             * 然后top++,表示下移一行,到第二行。             * */            for(int i=left;i<=right;i++){                rs[top][i] = num++;            }            top++;//向下移动一行            /*             * 从上到下             * 当i=1,i<=bottom;i++             * rs[i][right]表示从rs[1][n-1]到rs[n-1][n-1]依次赋值,             * 即为矩阵最右边一列元素,从上到下依次赋值             * 然后right--表示将最后一列列赋值之后数组下标依次向倒数第二列,倒数第三列移动             * */            for(int i= top;i<=bottom;i++){                rs[i][right] = num++;            }            right--;            /*             * 从右向左             * i从倒数第二列开始,当i>=left;i--             * rs[bottom][i]表示从矩阵的最后一行的倒数第二个元素开始依次从右向左赋值并移动             * bottom--,表示赋值之后从下向上移动一行             *             * */            for(int i= right;i>=left;i-- ){                rs[bottom][i] = num++;            }            bottom--;            /*             * 从下向上             * 当i=bottom;i>=top;i--             * 表示从倒数第二行开始依次给最左边的列开始赋值,第一次赋值时left=0,代表矩阵的第一列             * 当left++后,表示移动到矩阵的第二列             * */            for(int i = bottom;i>=top;i--){                rs[i][left] = num++;            }            left++;        }        return rs;    }

完整的测试代码如下

package com.bean.algorithmexec;public class MatrixDemo {    /*     * 给定一个整形矩阵Matrix,请按照顺时针方向转圈的方式,输入(打印)元素值。     * 例如:     *  1  2  3  4     *  5  6  7  8     *  9 10 11 12     * 13 14 15 16     * 输出结果为:     * 1  2  3  4     * 12 13 14 5     * 11 16 15 6     * 10 9  8  7     *       * */    /*     * 转圈打印矩阵元素(顺时针转圈)     * */    public static int[][] generateMatrix(int n) {        int[][] rs = new int[n][n];        int top = 0,bottom = n-1,left = 0,right = n-1;        int num = 1;        //边界条件是 left<=right 同时 top<=bottom        while(left<=right && top <=bottom){            /*             * 从左向右             * 初次,当left=0时,rs[top][i]表示第一行的元素,             * i=left=0;赋值之后 i++,表示从第一行第一列的元素到第一行最后一个元素依次赋值,             * 然后top++,表示下移一行,到第二行。             * */            for(int i=left;i<=right;i++){                rs[top][i] = num++;            }            top++;//向下移动一行            /*             * 从上到下             * 当i=1,i<=bottom;i++             * rs[i][right]表示从rs[1][n-1]到rs[n-1][n-1]依次赋值,             * 即为矩阵最右边一列元素,从上到下依次赋值             * 然后right--表示将最后一列列赋值之后数组下标依次向倒数第二列,倒数第三列移动             * */            for(int i= top;i<=bottom;i++){                rs[i][right] = num++;            }            right--;            /*             * 从右向左             * i从倒数第二列开始,当i>=left;i--             * rs[bottom][i]表示从矩阵的最后一行的倒数第二个元素开始依次从右向左赋值并移动             * bottom--,表示赋值之后从下向上移动一行             *             * */            for(int i= right;i>=left;i-- ){                rs[bottom][i] = num++;            }            bottom--;            /*             * 从下向上             * 当i=bottom;i>=top;i--             * 表示从倒数第二行开始依次给最左边的列开始赋值,第一次赋值时left=0,代表矩阵的第一列             * 当left++后,表示移动到矩阵的第二列             * */            for(int i = bottom;i>=top;i--){                rs[i][left] = num++;            }            left++;        }        return rs;    }    public static void main(String[] args) {        // TODO Auto-generated method stub        int[][] result=generateMatrix(4);        printMatrix(result);    }    //顺序打印矩阵元素    private static void printMatrix(int[][] matrix) {        for(int i=0;i<4;i++) {            for(int j=0;j<4;j++) {                System.out.print(matrix[i][j]+"\t");            }            System.out.println();        }    }}

运行结果:

1 2 3 4

12 13 14 5
11 16 15 6
10 9 8 7

(完)

你可能感兴趣的文章
[今日关注]鼓吹“互联网泡沫,到底为了什么”
查看>>
[互联网学习]如何提高网站的GooglePR值
查看>>
[关注大学生]求职不可不知——怎样的大学生不受欢迎
查看>>
[关注大学生]读“贫困大学生的自白”
查看>>
[互联网关注]李开复教大学生回答如何学好编程
查看>>
[关注大学生]李开复给中国计算机系大学生的7点建议
查看>>
[关注大学生]大学毕业生择业:是当"鸡头"还是"凤尾"?
查看>>
[茶余饭后]10大毕业生必听得歌曲
查看>>
gdb调试命令的三种调试方式和简单命令介绍
查看>>
C++程序员的几种境界
查看>>
VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法
查看>>
VUE-Vue.js之$refs,父组件访问、修改子组件中 的数据
查看>>
Vue-子组件改变父级组件的信息
查看>>
Python自动化之pytest常用插件
查看>>
Python自动化之pytest框架使用详解
查看>>
【正则表达式】以个人的理解帮助大家认识正则表达式
查看>>
性能调优之iostat命令详解
查看>>
性能调优之iftop命令详解
查看>>
非关系型数据库(nosql)介绍
查看>>
移动端自动化测试-Windows-Android-Appium环境搭建
查看>>