博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA算法:回形矩阵输出
阅读量:4040 次
发布时间:2019-05-24

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

JAVA算法:回形矩阵输出

题目要求

给定一个整形矩阵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


算法设计

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	 * 	 * 要求:额外空间复杂度为O(1)	 * */		/*	 * 转圈打印矩阵元素(顺时针转圈)	 * */	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		//初始化一个 4*4的整形矩阵,从第一行第一列从左向右,第二行,第三行,直到第四行依次赋值 1,2,...16.		int[][] matrixDemo=new int[4][4];		matrixDemo=createMatrix();		printMatrix(matrixDemo);				//转圈打印		spiralOrderPrint(matrixDemo);				System.out.println("第二种算法设计");		int[][] result=generateMatrix(4);		printMatrix(result);			}	/*	 * 创建初始矩阵	 * */	private static int[][] createMatrix() {		// TODO Auto-generated method stub		int matrix[][]=new int[4][4];		int k=1;		for(int i=0;i<4;i++) {			for(int j=0;j<4;j++) {				matrix[i][j]=k;				k++;			}		}				return matrix;	}		//顺序打印矩阵元素	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();		}			}		//转圈打印	private static void spiralOrderPrint(int[][] matrix) {		int tR=0;		int tC=0;		int dR=matrix.length-1;		int dC=matrix[0].length-1;		while(tR<=dR && tC<=dC) {			printEdge(matrix, tR++, tC++, dR--,dC--);		}	}	private static void printEdge(int[][] matrix, int tR, int tC, int dR, int dC) {		// TODO Auto-generated method stub		if(tR==dR) {			//子矩阵只有一行时			for(int i=tC;i<=dC;i++) {			System.out.print(matrix[tR][i]+" ");			}					}else if(tC==dC) {			//子矩阵只有一列时			for(int i=tR;i<=dR;i++){				System.out.print(matrix[i][tC]+" ");			}					}else {			//一般情况			int curC=tC;			int curR=tR;			while(curC!= dC) {				System.out.print(matrix[tR][curC]+" ");				curC++;			}						while(curR!= dR) {				System.out.print(matrix[curR][dC]+" ");				curR++;			}						while(curC!= tC) {				System.out.print(matrix[dR][curC]+" ");				curC--;			}						while(curR!= tR) {				System.out.print(matrix[curR][tC]+" ");				curR--;			}		}	}	}

 

转载地址:http://rntdi.baihongyu.com/

你可能感兴趣的文章
Qt继电器控制板代码
查看>>
wpa_supplicant控制脚本
查看>>
gstreamer相关工具集合
查看>>
arm 自动升级脚本
查看>>
RS232 四入四出模块控制代码
查看>>
gstreamer插件之 videotestsrc
查看>>
autoupdate script
查看>>
linux 驱动开发 头文件
查看>>
/etc/resolv.conf
查看>>
container_of()传入结构体中的成员,返回该结构体的首地址
查看>>
linux sfdisk partition
查看>>
ipconfig,ifconfig,iwconfig
查看>>
opensuse12.2 PL2303 minicom
查看>>
电平触发方式和边沿触发的区别
查看>>
网络视频服务器移植
查看>>
Encoding Schemes
查看>>
移植QT
查看>>
如此调用
查看>>
计算机的发展史
查看>>
带WiringPi库的交叉编译如何处理一
查看>>