題目:輸入乙個矩陣,按照從外向裡以順時針順序依次列印出每乙個數字。例如:如果輸入如下矩陣:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
有三問:
1)如何實現轉圈列印矩陣?
2)如何實現順時針旋轉矩陣?
3)如何實現「之」字形列印矩陣?
題外話:
由於要列印輸出矩陣,從題目可以看出,數字位數有變化,所以統一按最大位數輸出,便於對齊。
使用位於標頭檔案中的格式化函式 std::setw(int n); 來固定每次輸出的位數。
1)先來實現轉圈列印矩陣。我們以順時針來轉圈。
從整體上來把握。先定義乙個列印一圈的函式,根據圈的左上角座標和右下角座標來確定圈的大小。
void printonecircle(int(*matrix)[4], int lefttopx, int lefttopy, int rightbottomx, int rightbottomy)
//當子矩陣只有一列時
else if(lefttopy == rightbottomy)
else
while(curx != rightbottomx)
while(cury != lefttopy)
while(curx != lefttopx)
}}
之後,定義順時針列印函式。
void clockwiseprint(int(*matrix)[4], int height, int width)
測試函式及 輸出結果如下所示:
2)接下來,我們來實現 順時針旋轉矩陣。旋轉後,矩陣中的內容發生變化。
採用的方法和第1)問的解法相似。先對一圈進行旋轉,之後,縮小一圈,繼續對內圈進行旋轉。直至最後。
void clockwiserotatematrix(int (*matrix)[4], int lefttopx, int lefttopy, int rightbottomx, int rightbottomy)
}
之後,從外圈向內圈 依次呼叫上面的這個函式。
void rotatematrix(int (*matrix)[4], int height, int width)
下面是測試函式及結果
3)實現「之」字形列印矩陣
該問題的解決方案和上面依然很類似。
上面是先列印指定的一圈,該問題要先列印指定的一條斜線。
由於之字形列印是上下來回交替著列印,所以要定義乙個bool變數來指示列印的方向。
void zigzagprintline(int (*matrix)[4], int leftx, int lefty, int rightx, int righty, bool isfrombottom)
之後,依次呼叫該斜線函式
void zigzagprintmatrix(int (*matrix)[4], int height, int width)
if(++righty > endy)
isfrombottom = !isfrombottom;}}
下面是測試函式及列印結果
「之」字形列印矩陣
package class 03 之 字形列印矩陣 題目 給定乙個矩陣matrix,按照 之 字形的方式列印這個矩陣,例如 1 2 3 4 5 6 7 8 9 10 11 12 之 字形列印的 結果為 1,2,5,9,6,3,4,7,10,11,8,12 要求 額外空間複雜度為o 1 public ...
「之」字形列印矩陣
題目 給定乙個矩陣matrix,按照 之 字形的方式列印這個矩陣,例如 1 2 3 4 5 6 7 8 9 10 11 12 之 字形列印的結果為 1,2,5,9,6,3,4,7,10,11,8,12 解題思路 採用兩個函式,乙個用於遍歷斜行,得到斜行左下角座標和右上角座標,另乙個函式用於列印兩個座...
「之」字形列印矩陣
題目 給定乙個矩陣matrix,按照 之 字形的方式列印這 個矩陣,例如 1 2 3 4 5 6 7 8 9 10 11 12 之 字形列印的結果為 1,2,5,9,6,3,4,7,10,11,8,12 要求 額外空間複雜度為o 1 思路 同樣是通過兩點來確定範圍,每次列印的斜線實際上是兩個點所在直...