一、题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。例如:如果输入矩阵:
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
二、Java代码实现
import java.util.ArrayList;
public class PrintMatrixClockWisely {
public static void main(String[] args){
int[][] matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
ArrayList<Integer> al = printMatrix(matrix);
System.out.println(al);
}
public static ArrayList<Integer> printMatrix(int[][] matrix){
ArrayList<Integer> list = new ArrayList<Integer>();
if(list == null) return list;
int rows = matrix.length;
int columns = matrix[0].length;
return printMatrix(matrix, columns, rows);
}
public static ArrayList<Integer> printMatrix(int[][] matrix,int columns, int rows){
ArrayList<Integer> list = new ArrayList<Integer>();
if(matrix == null || columns <=0 || rows <=0) return list;
int start = 0;
while(columns > start *2 && rows > start * 2){
list.addAll(print (matrix, columns, rows, start));
++start;
}
return list;
}
public static ArrayList<Integer> print(int[][] matrix, int columns, int rows, int start){
ArrayList<Integer> list = new ArrayList<Integer>();
int endX = columns - 1 - start;
int endY = rows - 1 -start;
//从左到右
for(int i = start; i <= endX; ++i)
list.add(matrix[start][i]);
// 从上到下
if(start < endY){
for(int i = start +1; i <= endY; ++i)
list.add(matrix[i][endX ]);
}
// 从右到左
if(start < endX && start < endY){ //至少两行两列
for(int i = endX -1; i >= start; --i)
list.add(matrix[endY][i]);
}
// 从下到上
if(start < endX && start < endY-1){
for(int i = endY-1; i > start; --i)
list.add(matrix[i][start]);
}
return list;
}
}