1 /*
2 顺时针打印矩阵
3 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:输入如下矩阵:
4 1 2 3 4
5 5 6 7 8
6 9 10 11 12
7 13 14 15 16
8 则依次打印出数字1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10
9 由于是以外圈到内圈的顺序依次打印,我们可以把矩阵想象成若干个圈,如图所示,我们可以用一个循环来打印矩阵,每一次打印矩阵中的一个圈。
10 接下来分析循环结束的条件。假设这个矩阵的行数是rows,列数是columns。打印第一圈的左上角的坐标是(0,0),第二圈的左上角的坐标是(1,1),依次类推。我们注意到,左上角的坐标中行标和列标总是相同的,于是可以在矩阵> 中选取左上角为(start,start)的一圈作为我们分析的目标、
11 对于一个5*5的矩阵而言,最后一圈只有一个数字,对应的坐标为(2,2)。我们发现5>2*2。对于一个6*6的矩阵而言,最后一圈有4个数字,其左上角的坐标任然是(2,2)。我们发现6>2*2依然成立,。于是我们可以得出,让循环继续> 的条件是columns>startX*2并且rows>startY*2。
12
2 顺时针打印矩阵
3 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:输入如下矩阵:
4 1 2 3 4
5 5 6 7 8
6 9 10 11 12
7 13 14 15 16
8 则依次打印出数字1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10
9 由于是以外圈到内圈的顺序依次打印,我们可以把矩阵想象成若干个圈,如图所示,我们可以用一个循环来打印矩阵,每一次打印矩阵中的一个圈。
10 接下来分析循环结束的条件。假设这个矩阵的行数是rows,列数是columns。打印第一圈的左上角的坐标是(0,0),第二圈的左上角的坐标是(1,1),依次类推。我们注意到,左上角的坐标中行标和列标总是相同的,于是可以在矩阵> 中选取左上角为(start,start)的一圈作为我们分析的目标、
11 对于一个5*5的矩阵而言,最后一圈只有一个数字,对应的坐标为(2,2)。我们发现5>2*2。对于一个6*6的矩阵而言,最后一圈有4个数字,其左上角的坐标任然是(2,2)。我们发现6>2*2依然成立,。于是我们可以得出,让循环继续> 的条件是columns>startX*2并且rows>startY*2。
12
13 */
15 void PrintMatrixClockwisely(int** numbers,int columns,int rows)
16 {
17 if(numbers == NULL || columns <= 0 || rows <= 0)
18 return;
19
20 int start = 0;
21
22 while(columns > start*2 && rows > start*2)
23 {
24 PrinMatrixInCircle(numbers,columns,rows,start);
25 ++start;
26 }
27 }
28
29 /*
30 仔细分析打印每一步的条件,第一步总是需要的,因为打印一圈至少有一步。如果只有一行,那么就不用第二步了。
31 也就是需要第二步的前提条件是终止行号大于起始行号。需要第三步打印的前提条件圈内至少有两行两列,也就是说除了要求终止行号大于起始行号之外,还要求终止列号大于起始列号。同理,需要打印出第四步的前提条件是至少
有三行两列,因此要求终止行号比起始行号至少大2,同时终止列号大于起始列号。
32 */
33
34 void PrinMatrixInCircle(int** numbers,int columns,int rows,int start)
35 {
36 int endX = columns-1-start;
37 int endY = rows-1-start;
38
39 for(int i = start; i <= endX; ++i)
40 {
41 int number = numbers[start][i];
42 printNumber(number);
43 }
44
45 if(start < endY)
46 {
47 for(int i = start + 1; i <= endY; ++i)
48 {
49 int number = numbers[i][endX];
50 printNumber(number);
51 }
52 }
53
54 if(start < endX && start < endY)
55 {
56 for(int i = endX - 1; i >= start; --i)
57 {
58 int number = numbers[endY][i];
59 printNumber(number);
60 }
61 }
62
63 if(start < endX && start < endY - 1)
64 {
65 for(int i = endY - 1; i >= start + 1; --i)
66 {
67 int number = numbers[i][start];
68 printNumber(numbers);
69 }
70 }
71 }