輸入乙個矩陣,按照從外向裡順時針依次列印每乙個數字。
如下圖矩陣:
這道題完全沒有涉及複雜的資料結構或者高階的演算法,看起來是乙個很簡單的題。但實際解決問題時,會在**中包含多個迴圈,並且還需要判斷多個邊界條件。寫**前一定要有著清晰的思路,把複雜的問題分解成若干個簡單的問題。
需要依次列印,我們可以把矩陣想象成若干個圈。用乙個迴圈來列印矩陣,每一次列印矩陣中的乙個圈,如下圖。
分析迴圈條件。假設這個矩陣的行數是rows,列數是columns。列印第一圈的左上角的座標是(1,1),第二圈的左上角座標是(2,2),依次類推。我們可以知道左上角的行標和列標總是相同的,於是可以在矩陣中選取左上角為(start,start)的一圈作為我們分析的目標。
對乙個5*5的矩陣而言,最後一圈只有乙個數字,對應的座標為(2,2)。我們發現5>2*2。對乙個6*6的矩陣而言,最後一圈有4個數字,其左上角的座標仍然是(2,2)。我們發現6>2*2依然成立。於是可以得出,讓迴圈繼續的條件是columns>startx*2並且rows>starty*2。所以我們可以用如下迴圈來列印矩陣:
void printmatrix(int** numbers,int columns,int rows)
}
接著我們考慮如何列印一圈的功能,即如何實現printmatrixincircle。
我們可以把列印一圈分為四步:第一步從左到右列印一行,第二步從上到下列印一列,第三步從右到左列印一行,第四步從下到上列印一列。每一步我們根據起始座標和終止座標用乙個迴圈就能列印出一行或者一列。
需要注意的是,最後一圈有可能退化成只有一行、只有一列,甚至只有乙個數字,因此列印這樣一圈就不需要四步。如下圖列印一圈可能只需要三步、兩步和一步。
因此我們要仔細分析列印時每一步的前提條件。第一步總是需要的,因為列印一圈至少有一步。如果只有一行,那麼就不用第二步了。也就是需要第二步的前提條件是終止行號大於起始行號。需要第三步列印的前提條件是圈內至少有兩行兩列,也就是說除了要求終止行號大於起始行號外,還需要終止列號大於起始列號。同理,需要列印第四步的前提條件是至少有三行兩列,因此要求終止行號比起始行號至少大於2,同時終止列號大於起始列號。
於是可以寫出如下**:
void printmatrixincircle(int** numbers,int columns,int rows,int start)
if(start < endy) //從上到下列印一行 }
if(start < endx && start < endy) //從右到左列印一行 }
if(start < endx && start <= endy) //從下到上列印一行 }
}
窗外35°,真好。 劍指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...