这是一道很经典的题目(顺时针打印矩阵),每次做这道题就让我想起来当初大一的时候刚学c语言那会儿,那时候对编程无比痴迷,每次写代码都写很久,现在感觉已经失去了那份痴迷很久了。
那下面步入正题吧!!!顺时针打印矩阵,其实这和我们玩过的一种游戏很相似--------贪食蛇,特别是以前的诺基亚手机那会,如下一个矩阵:
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]
我看网上有些人的算法很奇怪(也有可能是我太愚钝理解不了),他们居然想的是总结出该矩阵圈数的规律,按照圈数来循环打印,我的思路很直接,题目要求不是让我们按照顺时针来打印吗?我们可以把这个矩阵想象成贪食蛇的活动区域(也可以说是诺基亚的手机屏幕框框),怎么控制贪食蛇让它顺时针依次铺满整个屏幕。
下面是我的代码:
import java.util.ArrayList;
/**
* 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,
* 例如,如果输入如下4 X 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.
*/
public class 顺时针打印矩阵 {
int count=0;
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> list = new ArrayList<>(); //要打印的序列列表
int flag = 0; //方向标志
int i =0,j = 0; //矩阵坐标
int top = 1; //距离上边框距离
int bottom = matrix.length-1; //距离下边框距离
int left = 0; //距离左边框距离
int right = matrix[1].length-1; //距离右边框距离
list.add(matrix[0][0]);
while (list.size()!=(matrix[0].length*matrix.length)){
if (flag==0){
j++;
if (j<=right){
list.add(matrix[i][j]);
}
else {
flag=1;
j=right;
right--;
}
}
if (flag==1){
i++;
if (i<=bottom){
list.add(matrix[i][j]);
}
else {
flag=2;
i = bottom;
bottom--;
}
}
if (flag==2){
j--;
if (j>=left){
list.add(matrix[i][j]);
}
else{
flag =3;
j = left;
left++;
}
}
if (flag==3){
i--;
if (i>=top){
list.add(matrix[i][j]);
}
else {
flag =0;
i = top;
top++;
}
}
}
return list;
}
public static void main(String[] args) {
顺时针打印矩阵 s = new 顺时针打印矩阵();
int[][] m = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
// int[][] m = {{1},{2},{3},{4}};
System.out.println(s.printMatrix(m).toString());
// System.out.println(s.count);
}
}