算法-29.顺时针打印矩阵
2020-08-21 本文已影响0人
zzq_nene
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
思路:与前面打印回环数组的算法类似。即定义方向,通过方向进行遍历,并且定义一个二维数组,用来将已经被遍历过的位置置为true,避免重复遍历
public static int[] spiralOrder(int[][] matrix) {
// 总的行数(二维数组第一个[]的长度)
int m = matrix.length - 1;
// 总的列数(二维数组第二个[]的长度)
int n = matrix[0].length - 1;
// 定义一个二维布尔数组,用来判断当前位置是否已经被遍历
boolean[][] matrixs = new boolean[m+1][n+1];
// 当前的行
int curM = 0;
// 当前的列
int curN = 0;
// 计算总元素个数
int count = (n + 1) * (m +1);
// 返回的元素一位数组
int[] elements = new int[count];
// 当前元素在一位数组中的索引
int cur = 1;
// 方向:0表示向右,1表示向下,2表示向左,3表示向上
int direction = 0;
// 初始化一位数组的第一个元素
elements[0] = matrix[0][0];
// 初始化二维布尔数组的第一个元素
matrixs[0][0] = true;
while (cur < count) {
switch (direction%4) {
case 0:
// 向右边
if (curN == n || matrixs[curM][curN+1]) {
curM++;
direction++;
} else {
curN++;
}
System.out.println("right");
break;
case 1:
// 向下边
if (curM == m || matrixs[curM+1][curN]) {
curN--;
direction++;
} else {
curM++;
}
System.out.println("down");
break;
case 2:
// 向左边
if (curN == 0 || matrixs[curM][curN-1]) {
curM--;
direction++;
} else {
curN--;
}
System.out.println("left");
break;
case 3:
// 向上边
if (curM == 0 || matrixs[curM-1][curN]) {
curN++;
direction++;
} else {
curM--;
}
System.out.println("top");
break;
}
System.out.println("curM:" + curM + " curN:" + curN);
elements[cur] = matrix[curM][curN];
matrixs[curM][curN] = true;
cur++;
}
return elements;
}