题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵
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
分析:做这道题需要我们缜密的逻辑思维,只要我们细心点都是可以做出来的。我的做题思路是首先要确定需要多少趟循环遍历,每一趟遍历是矩阵顺时针遍历一圈(或一行/一列),而每一趟的遍历的起始位置依次是(0,0),(1,1)...确定了每一趟的起始位置及次数,接下来就是写循环体了,顺序依次是从左到右、从上到下、从右到左、从下到上。改变每趟遍历顺序时注意好起始位置就没什么大问题了,程序如下:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> res;
if(matrix.empty()) return res;
int m=matrix.size(),n=matrix[0].size(),t=0,s=m*n,k; //s是容器数组的元素个数,
k=min(m,n)-1; //k是遍历的趟数;
if(k==0) k=1;
while(t<k){
int i=t,j=t; //i,j分别是每趟遍历的初始横纵坐标;
while(j<n) res.push_back(matrix[i][j++]);
if(s==res.size()) break;
j--;i++;
while(i<m) res.push_back(matrix[i++][j]);
if(s==res.size()) break;
i--;j--;
while(j>=t) res.push_back(matrix[i][j--]);
if(s==res.size()) break;
j++;i--;
while(i>t) res.push_back(matrix[i--][j]);
if(s==res.size()) break;
t++; n--;m--;
}
return res;
}