题目:输入一个矩阵,按照从外向里以顺时针的顺序依次扫印出每一个数字。
代码如下:
package demo;
public class Test20 {
public static void printMatrixClockWisely(int[][] numbers) {
if(numbers == null) {
return;
}
// 记录一环开始位置的行
int x = 0;
// 记录一环开始位置的列
int y = 0;
while(x*2 < numbers.length && y*2 < numbers[0].length) {
printMatrixInCircle(numbers, x, y);
x++;
y++;
}
}
private static void printMatrixInCircle(int[][] numbers, int x, int y) {
// 数组的行数
int rows = numbers.length;
// 数组的列数
int cols = numbers[0].length;
// 输出环的最上面的一行
for(int i = y; i <= cols - y - 1; i++) {
System.out.print(numbers[x][i] + "");
}
// rows-x-1:环的最下面的一行的行号
// rows-x-1 > x:表明环不只有一行
if(rows-x-1 > x) {
// 因为右边那列最上面的那个已经被输出了,因此行从x+1开始,一只输出到最下面一行
for(int i=x+1;i<=rows-x-1;i++) {
System.out.print(numbers[i][cols-y-1]+"");
}
}
// cols-1-y>y:环不只有一列。这样才会进行第3步,输出下面一行
if(rows-1-x > x && cols-1-y > y) {
// 因为环的右下角的位置已经输出了,因此列号从cols-y-2开始
for(int i = cols-y-2; i >= y; i--) {
System.out.print(numbers[rows-1-x][i] + "");
}
}
// 至少有3行,才会进行第4步
if(cols-1-y>y && rows-1-x > x+1) {
// 因为最左边一列的第1个和最后1个都已经被输出了,
// 因此从倒数第2行(rows-1-x-1),输出到第2行(x+1)
for(int i = rows-1-x-1;i>=x+1;i--) {
System.out.print(numbers[i][y]+"");
}
}
}
}