顺时针打印矩阵

题目:输入一个矩阵,按照顺时针打印矩阵内容,例如矩阵为:

01 02 03 04

05 06 07 08

09 10 11 12

13 14 15 16

打印结果为1,2,3,4,8,12,16,15,14,13,9,5

分析

简化分解问题,顺时针打印需要先输出第一排1,2,3,4,然后再打印8,12,16,接着是15,14,13,最后是9,5.

先说第一步,第一排打印的数据至少有一个,除非数组为空,因为数组至少有一行.

再说第二步,第二步是竖着打印最后一排数据如8,12,16.它有一个前提条件,就是该数组至少有两行,如果只有一行那就不存在竖着打印.

再说第三步,第三步是倒着打印最后一排数据如15,14,13,它也有个先决条件,就是数组的行数和列数都需要大于2,然后从最后一行,最后一列的前个数开始向左开始遍历数组,一直到最后一行,第一列的位置为止.

最后是第四步,打印9,5,同样第四步需要条件才能执行,它需要行数要大于等于3行,列数要大于等于2,然后从第一列,倒数第二行开始向上遍历数组,一直到正数第二行结束为止.

代码实现

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class DoIt {

public static void printIt(int[][] nums ,int cols
,int rows ,int start){
int endX = cols - 1 - start;
int endY = rows - 1 - start;

for (int i = start;i <= endX;i++){ //打印第一行
int number = nums[start][i];
printNumber(number);
}

if (start<endY){ //start小于endY表示该数组至少有两行
for (int i = start+1; i<=endY;i++){//start+1表示从第二行开始
int number = nums[i][endX]; //i<=endY表示到最后一行结束
printNumber(number);
}
}

if (start<endX && start<endY){//start<endX&&start<endY表示数组至少有2行2列
for (int i = endX-1; i>=start;i--){ //倒着输出,从endY-1开始,到start为止
int number = nums[endY][i];
printNumber(number);
}
}

if (start<endX&& start<endY-1){//start<endY-1表示数组至少有三行
for (int i = endY-1; i>=start+1;i--){//倒着输出,从最后一行的向上一个
int number = nums[i][start];//位置开始,到start的下面一个位置结束
printNumber(number);
}
}

}

private static void printNumber(int num){
System.out.print("\t"+num);
}

}

总结

使用绘图可以帮助思考问题,考虑问题也全面一些.