題目描述:輸入乙個矩陣,按照從外向裡以順時針列印出每乙個數字,例如:輸入如下矩陣,則依次列印出的數字為:1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10.
思路分析:當我們順時針列印該矩陣時,每一圈的起始位置是左上角的元素,並且每一圈左上角元素都有乙個共同點:它的行和列所對應的的下標都是相同的。因此不難想到,該矩陣列印結束的條件就是左上角的元素下標走到了該矩陣行和列的一半時該矩陣也就列印結束了。因為矩陣也是用下標來確定某個數字的,所以這裡就是:4>1*2
可是,我們上面給的矩陣很特殊,並且行和列的都是偶數個,不具有說服力,我們還需要考慮考慮其他的情況,以驗證我們得到的結論是否具有普遍性。例如:乙個7*7的矩陣,將該矩陣列印結束的條件就是:左上角的元素為(3,3)時,也就是說7>3*2
這裡乘二也是因為矩陣每列印完一圈,對應的下三角部分已經列印過了。矩陣列印的大體框架我們已經做好了,現在還有乙個問題,就是如何列印矩陣的每一圈
如上圖,矩陣列印一圈需要四步,這個是一般情況,當我們的矩陣是行大於列、列大於行的時候可能不需要四步,就可以列印結束,如下圖:
從上圖不難看出,無論是乙個怎樣的矩陣,它都會進行第一步,並且如果列印乙個矩陣它進行了第三步,那麼一定走了一二步,也就是說後面的每一步是建立在前面步的基礎之上的,我們總結一下列印每一圈。
(1)從左往右:肯定有;
(2)從上到下:矩陣行數至少為2,即:終止行號必須大於起始行號(這裡不可以等於哦,否則會產生矩陣右上角的元素重複多列印一次);
(3)從右往左:矩陣至少為兩行兩列,即:終止列號必須大於起始列號,並且終止行號必須大於起始行號(同樣,不可以等於,否則矩陣右下角的元素會多列印一次);
(4)從下到上:矩陣至少為三行兩列,即:終止行號必須比起始行號大2,並且終止列號必須大於起始列號(同樣,不可以等於,否則會出現左下角和右上角元素多列印一次)
**實現:
void printonecircle(vector> matrix, int rows, int cols, int start, vector& v)
//從上到下列印
if (start= start; i--)
//從下到上列印
if (start= start + 1; i--) }
vectorprintmatrix(vector> matrix)
return v;
}
2.
vectorprintonecircle(vector> matrix, int rows, int cols, int start)
//從上到下列印
if (start= start; i--)
//從下到上列印
if (start= start + 1; i--)
return v;
}vectorprintmatrix(vector> matrix)
, };
vectorv = printmatrix(matrix);
return 0;
}
1和2的區別在於,列印每一圈的函式的返回型別不同
void printonecircle(int** numbers, int cols, int rows, int start)
//從上到下
if (start < endy) }
//從右往左
if (start < endx&&start < endy) }
//從下到上
if (start < endx&&start < endy - 1) }
}void printmatrix(int** numbers, int cols, int rows)
}
順時針列印矩陣
輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。例如 如果輸入如下矩陣 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...