【稱號】
輸入矩陣。按照順序從外到內順時針轉動在列印出的每個數字。例如:假定輸入例如,下面的矩陣:
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皆為特殊矩陣,列印步驟和情況1略有不同。情況1列印能夠遞迴一圈圈從外到內列印,分為4步,觀察每一圈的起始位置都在對角線上,即(start,start)。那麼何時才幹知道無法再遞迴列印了呢。觀察4*4矩陣,最後一圈起始位置(1,1),4>1的2倍。5*5矩陣,最後一圈起始位置(2,2),5>2的2倍。所以能夠得到,當矩陣維數大於起始位置的兩倍時,是存在一圈的,否則,已經列印全然了。
列印一圈的詳細步驟:
1. 從起始位置開始,從左至右依次列印本行,至本行結束(無條件執行)。
2. 從下一行開始,從上到下依次列印本列。至本列結束,可是有前提,考慮到特殊情況2,沒有列,僅僅有一行,所以無需第二步。由此,在這一步須要提前推斷是否有必要繼續,非要執行這一步矩陣就至少要有兩行,所以利用終止行號是否大於起始行號來推斷;
3. 矩陣至少是兩行兩列時才須要第三步,第三步從右至左順序列印,不僅須要終止行號大於起始行號,並且還要終止列號大於起始列號(第2步執行了,才考慮第三步,所以這個是必要條件);
4. 矩陣至少三行兩列,才須要執行第四步,要保證終止行號至少要比起始行號大2,同一時候終止列號大於起始列號(第3步執行了。第4步才考慮)。
【測試**】
//順序列印矩陣
#include
void printnumber(int number)
void printmatrixincircle(int **numbers, int rows, int columns, int start)
//第二步:從右上到右下
if(start < end_bottom)
}//第三步:從右到左
if(start < end_right && start < end_bottom)
}//第四步:從左下到左上
if(start < (end_bottom-1) && start < end_right)
}}//輸入二維矩陣,行和列。遞迴列印每一圈
void printmatrixclockwisely(int **numbers, int rows, int columns)
}void printmatrix(int **numbers, int rows, int columns)
}//測試**
void test(int rows, int columns)
printf("test(%d,%d):\n",rows,columns);
printmatrix(numbers, rows, columns);
printf("\n順時針列印:\n");
printmatrixclockwisely(numbers, rows, columns);
printf("\n***********************************************\n");
}void main()
【輸出】
這裡要注意**中怎樣利用二維陣列操作二維指標的過程。
順時針列印矩陣
輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。例如 如果輸入如下矩陣 1 2 3 45 6 7 89 10 11 1213 14 15 16則依次列印出數字 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。這個題目 寫的並不好感覺,好多if看著就煩,就是...
順時針列印矩陣
題目 給定乙個矩陣,從外向內順時針列印矩陣中的每乙個數字。例如 給定矩陣 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 輸出應該為 分析 這道題的意思非常直觀,給人的感覺也是so easy,然而實際去做的時候會發現,如果結構劃分的不好,會出現很多的迴圈,而且包括對各種...
順時針列印矩陣
from 題目 輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。例如 如果輸入如下矩陣 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。網上聽說聽到包括autod...