1.题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
2.分析
每次打印矩阵最外面的一圈(用方法printMatrixInCircle()表示),每次都是这个操作,所以可以采用递归。每次打印矩阵的左上角的横纵坐标相同,即为start,而其余三个角的坐标都与行列数以及start有关,因此只需要for循环即可实现打印。
当然,其实只要针对start进行循环判断,start*2的值小于行数和列数时才需要继续打印,这样,通过这个条件,可以用循环来打印每次的最外圈矩阵。
3.程序
1 package first; 2 3 public class PrintMatrix { 4 public void printMatrix(int[][] matrix) { 5 if(matrix==null || matrix.length<=0) 6 return; 7 printMatrixInCircle(matrix, 0); 8 } 9 10 private void printMatrixInCircle(int[][] matrix,int start) { 11 int row=matrix.length; 12 int col=matrix[0].length; 13 int endX=col-1-start; 14 int endY=row-1-start; 15 if(endX<start || endY<start) 16 return; 17 //仅一行 18 if(endY==start) { 19 for(int i=start;i<=endX;i++) { 20 System.out.print(matrix[start][i]+" "); 21 } 22 return; //记得结束 23 } 24 //仅一列 25 if(endX==start) { 26 for(int i=start;i<=endY;i++) { 27 System.out.print(matrix[i][start]+" "); 28 } 29 return; //记得结束 30 } 31 32 //打印边界 33 for(int i=start;i<=endX;i++) { 34 System.out.print(matrix[start][i]+" "); 35 } 36 for(int i=start+1;i<=endY;i++) { 37 System.out.print(matrix[i][endX]+" "); 38 } 39 for(int i=endX-1;i>=start;i--) { 40 System.out.print(matrix[endY][i]+" "); 41 } 42 for(int i=endY-1;i>=start+1;i--) { 43 System.out.print(matrix[i][start]+" "); 44 } 45 46 //继续打印更内部的矩阵,令start+1 47 printMatrixInCircle(matrix, start+1); 48 } 49 50 51 public static void main(String[] args) { 52 PrintMatrix demo = new PrintMatrix(); 53 int[][] a= {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; 54 // int[][] a= {}; 55 // int[][] a= {{}}; 56 // int[][] a= {{1}}; 57 // int[][] a= {{1,2,3,4}}; 58 // int[][] a= {{1},{2},{3},{4}}; 59 // int[][] a= {{1,2,3},{4,5,6}}; 60 // int[][] a=null; 61 demo.printMatrix(a); 62 } 63 }