例如輸入以下矩陣:
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
1 #include<stdio.h>
2 #include<iostream>
3 #include<tchar.h>
4
5 void PrintMatrixInCircle(int** numbers, int columns, int rows, int start);
6 void printNumber(int number);
7
8
9 //方法1
10 void PrintMatrixClockwisely(int** numbers, int columns, int rows)
11 {
12 if(numbers == NULL || columns <= 0 || rows <= 0)
13 return;
14
15 int start = 0 ;
16
17 while(columns > start * 2 && rows > start * 2)
18 {
19 PrintMatrixInCircle(numbers, columns, rows, start);
20
21 ++start;
22 }
23 }
24
25 //打印一圈
26 void PrintMatrixInCircle(int** numbers, int columns, int rows, int start)
27 {
28 // rows 行
29 // columns 列
30 int endX = columns - 1 - start; //x方向水平向右
31 int endY = rows - 1 - start; //y方向垂直向下
32
33 //從左到右打印一行
34 for(int i = start; i <= endX; ++i)
35 {
36 int number = numbers[start][i];
37 printNumber(number);
38 }
39
40 //從上到下打印一行
41 if(start < endY)
42 {
43 for(int i = start + 1; i <= endY; ++i)
44 {
45 int number = numbers[i][endX];
46 printNumber(number);
47 }
48 }
49
50 //從右到左打印一行
51 if(start < endX && start < endY)
52 {
53 for(int i = endX - 1; i >= start; --i)
54 {
55 int number = numbers[endY][i];
56 printNumber(number);
57 }
58 }
59
60 //從下到上打印一行
61 if(start < endX && start < endY - 1)
62 {
63 for(int i = endY - 1; i >= start + 1; --i)
64 {
65 int number = numbers[i][start];
66 printNumber(number);
67 }
68 }
69 }
70
71 void printNumber(int number)
72 {
73 printf("%d\t", number);
74 }
75
76
77 //方法2
78 void PrintMatrixCircle(int** numbers, int startX, int startY, int endX, int endY);
79 void PrintMatrixClockwisely1(int** numbers, int columns, int rows)
80 {
81 if(numbers == NULL || columns <= 0 || rows <= 0)
82 return;
83
84 //rows 行
85 //columns 列
86 int startX = 0;
87 int startY = 0;
88 int endX = rows - 1; //x 方向垂直向下
89 int endY = columns - 1; //y 方向水平向右 和方法1的x,y方法不同 不過並不重要
90
91 while(true)
92 {
93 if(startX > endX && startY > endY)
94 break;
95 if(startX == endX && startY > endY)
96 break;
97 if(startX > endX && startY == endY)
98 break;
99
100 PrintMatrixCircle(numbers, startX, startY, endX, endY);
101 ++startX;
102 ++startY;
103 --endX;
104 --endY;
105 }
106 }
107
108 void PrintMatrixCircle(int** numbers, int startX, int startY, int endX, int endY)
109 {
110 //只有一行的情況,直接打印。
111 if(startX == endX && startY != endY)
112 {
113 for(int j = startY; j <= endY; ++j)
114 {
115 int number = numbers[startX][j];
116 printNumber(number);
117 }
118 }
119
120
121 //ps 當最後只有一個數字時,一行一列都打印,為了避免重復
122 //在只有一行的情況下,加了一個 startY != endY.
123
124 //只有一列的情況,直接打印。
125 if(startY == endY)
126 {
127 for(int i = startX ; i <= endX; ++i)
128 {
129 int number = numbers[i][startY];
130 printNumber(number);
131 }
132 }
133
134 //打印一圈
135 for(int p = startY; p < endY; ++p)
136 {
137 int number = numbers[startX][p];
138 printNumber(number);
139 }
140
141 for(int q = startX; q < endX; ++q)
142 {
143 int number = numbers[q][endY];
144 printNumber(number);
145 }
146
147 for(int m = endY; m > startY ; --m)
148 {
149 int number = numbers[endX][m];
150 printNumber(number);
151 }
152 for(int n = endX; n > startX; --n)
153 {
154 int number = numbers[n][startY];
155 printNumber(number);
156 }
157 }
158
159
160
161 int main(int argc, _TCHAR* argv[])
162 {
163
164 /*
165 1 2 3 4 5
166 6 7 8 9 10
167 11 12 13 14 15
168 16 17 18 19 20
169 21 22 23 24 25
170 */
171
172 int columns = 5;
173 int rows = 5;
174
175 if(columns < 1 || rows < 1)
176 exit(1);
177
178 int** numbers = new int*[rows];
179 for(int i = 0; i < rows; ++i)
180 {
181 numbers[i] = new int[columns];
182 for(int j = 0; j < columns; ++j)
183 {
184 numbers[i][j] = i * columns + j + 1;
185 }
186 }
187 printf("Solution1 Begin: %d columns, %d rows.\n", columns, rows);
188 PrintMatrixClockwisely(numbers, columns, rows);
189 printf("\n");
190 printf("\n");
191
192 printf("Solution2 Begin: %d columns, %d rows.\n", columns, rows);
193
194 PrintMatrixClockwisely1(numbers, columns, rows);
195
196
197 for(int i = 0; i < rows; ++i)
198 delete[] (int*)numbers[i];
199
200 delete[] numbers;
201 printf("\n");
202
203 return 0;
204 }
