我是靠谱客的博主 仁爱哈密瓜,最近开发中收集的这篇文章主要介绍输入一个矩阵,按照从外向里以顺时针的顺序依次扫印出每一个数字,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

思考:对于一个矩阵,要按顺时针打印依次打印,一般分为四个步骤,四个步骤组成一个环行,由外向里依次打印

一致的步骤图如下:(本人画的草图)

下面来分别说说这四个步骤:

步骤1:第一步从左到右打印该环的第一行

步骤2:当第一步完成后,需要从该行的最右的元素开始向下打印该环最右边的列

步骤3:第二步完成后,从右到左依次打印该环最下面行的元素

步骤4:第三步完成后,从上到下打印该环的最左边的列

以上四步就是实现顺时针打印的思路,在这里需要注意几个特殊情况,如果给定的矩阵只有一行或者只有一列或者当外向里打印时只剩下一行或者一列,那么打印的操作就走不了完整的四步。有的只需要三步,两步,甚至一步

下面我列出这几种特殊情况:

1.当给定的或者执行到最后矩阵只有一行,那么打印该矩阵只执行了步骤1就结束

2.当给定的或者执行到最后矩阵只有一列,那么打印该矩阵只执行了步骤1和步骤2就结束

3.当给定的或者执行到最后矩阵只有两行N列,那么打印该矩阵只执行了步骤1、步骤2和步骤3就结束


所以我们在实现的时候需要特别注意以上几种情况:

通过上述我们可以知道,步骤1是必然要执行的,那么步骤2的执行条件就需要该环至少有两行数据(就是说打印的一定要有两行才能打印),执行步骤3的条件就是要求该环至少有两列和两行,步骤4的条件是该环至少有三行与两列

分析完了,接下来就来上代码吧:

public class PrintMatrixInCircle {
	public static void print(int[][] numbers) {
		//如果给定矩阵为空 则直接return
		if(numbers == null) {
			return;
		}
		
		int x = 0;//记录每个环开始位置的行数
		int y = 0;//每个环开始位置的列数
		
		/**
		 * 我们知道对于一个矩阵,它的最大行数为(numbers.length-1)/2,同时它的最大列数位(numbers[0].length-1)/2
		 * 所以我们在循环打印的时候,用最大行数和最大列数最为限制条件
		 */
		if(x<(numbers.length-1)/2 && y<(numbers[0].length-1)/2) {
			printMatrixInCircle(numbers,x,y);
			//当完成一个环的打印后 有外往里走,起始位置加1
			x++;
			y++;
			
		}
	}
	
	public static void printMatrixInCircle(int[][] numbers,int x,int y) {
		//二维数组的行数
		int rows = numbers.length;
		//二维数组的列数
		int columns  = numbers[0].length;
		
		/**
		 * 步骤1
		 * columns-1-y含义是最右边这一列的列数
		 */
		for(int i=y;i<columns-1-y;i++) {
			System.out.print(numbers[x][i]+" ");
		}
		
		/**
		 * 步骤2
		 * 在上面已经分析了,步骤2的执行条件就需要该环至少有两行数据(就是说打印的一定至少要有两行才能打印),
		 * 那么我们这里需要加一个判断进行过滤
		 * rows-1-x代表的就是该环最下面行的行数 rows-1-x>x的意思就是该环至少有两行数据
		 * columns-y-1代表的是该环最右边列的列数
		 */
		if(rows-1-x >x) {
			for(int i=x+1;i<=rows-1-x;i++) {
				System.out.print(numbers[i][columns-y-1]+" ");
			}
		}
		
		/**
		 * 步骤3
		 * 步骤3的执行条件是该环至少有两列数据和两行数据
		 * 也加一个if进行过滤
		 * 
		 */
		if(rows-1-x > x && columns-1-y >y) {
			for(int i=columns-1-y-1;i>=y;i--) {
				System.out.print(numbers[rows-1-x][i]+" ");
			}
		}
		
		/**
		 *步骤4
		 *条件是该环至少有三行与两列
		 *row-1-x-1>x代表环数据至少有3行  colunmns-1-y>y代表数据至少有两列
		 */
		if(rows-1-x-1>x && columns-1-y >y) {
			for(int i = rows-1-x-1;i>= x+1; i--) {
				System.out.print(numbers[i][y]+" ");
			}
		}
	}
1 2 3 4 6 7 8 9 10 11 12 13 14 15 16 

public static void main(String[] args) {int[][] numbers = { {1, 2, 3, 4, 5}, {16, 17, 18, 19, 6}, {15, 24, 25, 20, 7}, {14, 23, 22, 21, 8}, {13, 12, 11, 10, 9}, };print(numbers);}}


运行结果如下:

1 2 3 4 6 7 8 9 10 11 12 13 14 15 16



最后

以上就是仁爱哈密瓜为你收集整理的输入一个矩阵,按照从外向里以顺时针的顺序依次扫印出每一个数字的全部内容,希望文章能够帮你解决输入一个矩阵,按照从外向里以顺时针的顺序依次扫印出每一个数字所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部