面試題29:順時針列印矩陣。輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。
由於是以從外圈到內圈的順序依次列印的,所以我們可以把矩陣想象成若干個圈。我們可以用迴圈列印矩陣,每次列印矩陣中的乙個圈。
接下來分析迴圈結束的條件,假設這個矩陣的行數是rows,列數是columns,列印第一圈的左上角座標是(0,0),第二圈的左上角座標是(1,1),以此類推。我們注意到,左上角的座標中行標和列標總是相同的,於是我們可以在矩陣中選取左上角為(start,start)的一圈作為我們分析目標。
對於乙個5*5的矩陣,最後一圈只有乙個數字,對應座標為(2,2),我們發現5>2*2。對於6*6的矩陣而言,最後一圈有四個數字,其左上角的座標仍為(2,2),6>2*2依然成立。於是得出列印一圈的條件是columns>startx*2,rows>starty*2。
接下來考慮如何列印一圈。我們把列印一圈分為四步:第一步,從左到右列印一行;第二步,從上到下列印一列;第三步,從右向左列印一行;第四步,從下到上列印一列。
在列印時,最後一圈有可能退化成只有一行、只有一列甚至只有乙個數字。但第一步總是需要列印的,如果只有一行,就不需要第二步了。第二步的前提條件是終止行號大於起始行號。第三步列印的條件是終止行號大於起始行號並且終止列號大於起始列號。第四步列印的條件是終止行號比起始行號最少大2並且終止列號大於起始列號:
#include
using
namespace std;
void
printmatrixincircle
(int
** numbers,
int rows,
int columns,
int start)
// 列印第二步
for(
int i = start +
1; i <= endy;
++i)
//列印第三步
if(endy > start)
}// 列印第四步
if(endx > start)}}
void
printmatrixclockwisely
(int
** numbers,
int rows,
int columns)
int start =0;
while(2
* start < rows &&
2* start < columns)
}void
test
(int columns,
int rows)
}printmatrixclockwisely
(numbers, rows, columns)
;printf
("\n");
for(
int i =
0; i < rows;
++i)
delete
(int
*)numbers[i]
;delete
numbers;
}int
main()
劍指offer 順時針列印矩陣
題目 輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。例如 如果輸入如下矩陣 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。分析 第一次看到這個題目的時候,覺得...
劍指offer 順時針列印矩陣
題目描述 輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字,例如,如果輸入如下矩陣 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.思路 遞迴列印,處理好邊界就ok...
劍指offer 順時針列印矩陣
題目描述 給定乙個矩陣按照順時針順序從外到內的列印這個矩陣 解題思路 設定乙個全域性的方向向量dir其中的順序是向右,向下,向左,向上 每次給行加上乙個方向向量,當出現越界或者已經列印過的時候重新選擇方向 vectorprintmatrix vector matrix int d 0 int row...