题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
思路:其实就是采用递归,所谓的顺时针就像围着矩阵转圈圈,先读取第一行数据,之后读最右边列的数据,再读最下行的数据,再读回最左边列的数据,读了一圈,还有数据就再按照这样方式把数据读完。
代码:
/** * Created by ASUS on 2018/6/1 * * @Authod Grey Wolf */ import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Test2 { public static void main(String[] args) { Test2 test2 = new Test2(); test2.sys1(); } /** * 输入矩阵 */ private void sys1() { Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); int m=scanner.nextInt(); int [][]matrix=new int[n][m]; int i,j; for(i=0;i<n;i++){ for (j=0;j<m;j++){ matrix[i][j]=scanner.nextInt(); } } List<Integer> list=printMatrix(matrix); for (Integer integer:list){ System.out.print(integer+" "); } } /** * 处理矩阵输出的顺序 * @param matrix * @return */ private List<Integer> printMatrix(int[][] matrix) { List<Integer>list=new ArrayList<>(); read(matrix,list,0); return list; } /** * 采用递归按顺时针读取矩阵的值 * @param matrix * @param list * @param start */ private void read(int[][] matrix, List<Integer> list, int start) { int row=matrix.length; int col=matrix[0].length; if(matrix==null||row<1||col<1||start<0){ return; } if(col<=2*start||row<=2*start){ return; } //矩阵一圈中最右列在坐标中的位置 int stopX=col-1-start; //一圈中最大行在坐标中的位置 int stopY=row-1-start; int i; //打印此圈中的最上行 for(i=start;i<=stopX;i++){ list.add(matrix[start][i]); } //打印此圈中的最右列,此圈中至少有一列 if(start<=stopX){ for (i=start+1;i<=stopY;i++){ list.add(matrix[i][stopX]); } } //打印此圈中的最下行 if(start<stopX&&start<stopY){ for(i=stopX-1;i>=start;i--){ list.add(matrix[stopY][i]); } } //打印此圈中的最左列 if(start<stopX&&start<stopY-1){ for (i=stopY-1;i>=start+1;i--){ list.add(matrix[i][start]); } } //递归打印下一圈 read(matrix,list,start+1); } }
效果:
4 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
Process finished with exit code 0
我的座右铭:不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行。