題目:輸入一個矩陣,按照從外向里以順時針的順序依次列印出每一個數字。 例如輸入以下矩陣: 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 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 }