循环打印矩阵(算法)

题目:给定一个矩阵matrix,从第一个元素开始循环打印矩阵,例如:

在这里插入图片描述
打印结果为:1,5,6,8,3,8,3,7,6,1,6,6,2,7,2,8。

算法思想:循环打印矩阵可以分而治之,即先打印最外围的一圈,依次往里推则可解决该问题。

打印最外围方法如下:定义一个动点P(curR,curC),初始时curR=row1,curC=col1,①curC递增(终止条件为curC=col2),②curR递增(终止条件为curR=row2),③curC递减(终止条件为curC=col1),④curR递减(终止条件为curR=row1)。这样矩阵外围就按照条件打印出来了,然后将点A,B分别往中心移动一次,即row1++,col1++;row2–,col2–,重复上述四个步骤即可。

算法代码如下:

package test_class_03;

public class PrintMatrixSpiralOrder {
	
	public static void SpiralOrderPrint(int [][]Matrix){
		int row1=0;
		int col1=0;
		int row2=Matrix.length-1;
		int col2=Matrix[0].length-1;
		while(row1 <= row2 && col1 <= col2){
			printSqure(Matrix,row1++,col1++,row2--,col2--);
		}
		System.out.println();
	}
	
	public static void printSqure(int [][]Matrix,int row1,int col1,int row2,int col2){
		int curR=row1;
		int curC=col1;
		if(row1==row2){
			while(curC!=col2+1){
				System.out.print(Matrix[curR][curC++]+" ");
			}
		}else if(col1==col2){
			while(curR!=row2+1){
				System.out.print(Matrix[curR++][curC]+" ");
			}
		}else{
			while(curC!=col2){
				System.out.print(Matrix[curR][curC++]+" ");
			}
			while(curR!=row2){
				System.out.print(Matrix[curR++][curC]+" ");
			}
			while(curC!=col1){
				System.out.print(Matrix[curR][curC--]+" ");
			}
			while(curR!=row1){
				System.out.print(Matrix[curR--][curC]+" ");
			}
		}
	}
	
	public static void main(String[] args) {
		int [][]m={{4,5,6,8},{6,2,7,3},{6,8,2,8},{1,6,7,3}};
		SpiralOrderPrint(m);
	}
}

发布了17 篇原创文章 · 获赞 60 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_36744540/article/details/89763644
今日推荐