输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.
注意主函数中的vector定义的二维数组
#include
using namespace std;
vector<int> printMatrix(vector<vector<int> > matrix) {
int m,n,r=0,c=0,j,k=0,sum=0,i_f=0,j_f=0,s,s_r=1,s_c=0;
//k,i_f,j_f用来控制打印这一行还是这一列,是从左往右打印还是从右往左打印
//s_r,s_c用来控制倒着(从右往左,从下往上)打印时停止的行和列
//r,c用来控制正着打印停止的行和列
//s统计总的数字数,sum是当前打印了多少个数字
vector<int> res;
m=matrix.size();
if (m==0)
return res;
n=matrix[0].size();
s=m*n;
while(sum<s){
if(k%2==0){//输出这一行
if(j_f%2==0){//行+1
for(c;c<n;c++){
res.push_back(matrix[r][c]);
++sum;
}
++r;//输出完这一行,行数+1
--c;//列数置为有效值,刚刚循环里的c超出有效范围
--n;//下一次再打印从左往右的一行时,就去掉最后一列
}
else{//行-1
for(c;c>=s_c;c--){
res.push_back(matrix[r][c]);
++sum;
}
--r;//输出完这一行,行数-1
++c;//列数置为有效值
++s_c;//修改起始地行
}
++j_f;
}
else{//输出这一列
if(i_f%2==0){//列+1
for(r;r<m;r++){
res.push_back(matrix[r][c]);
++sum;
}
--c;
--r;
--m;
}
else{//列-1
for(r;r>=s_r;r--){
res.push_back(matrix[r][c]);
++sum;
}
++c;
++r;
++s_r;
}
++i_f;
}
++k;
}
return res;
}
int main(){
vector<vector<int> > m(4);
vector<int> res;
int k=1;
for(int i=0;i<4;i++){
//m[i].resize(4);
for(int j=0;j<4;j++){
m[i].push_back(k);
//m[i][j]=k;
++k;
}
}
for(int i=0;i<4;i++){
for(int j=0;j<4;j++)
cout<<m[i][j]<<" ";
}
res=printMatrix(m);
for(int i=0;i<16;i++){
cout<<res[i]<<" ";
}
return 0;
}
思路和上述代码差不太多,只不过比上一个更清晰
#include
using namespace std;
vector<int> printMatrix(vector<vector<int> > matrix) {
int i,m,n,left=0,right,top=0,bottom;
vector<int> res;
m=matrix.size();
if (m==0)
return res;
n=matrix[0].size();
right=n-1;
bottom=m-1;
while(left<=right&&top<=bottom){
//从左到右打印一行
for(i=left;i<=right;i++)
res.push_back(matrix[top][i]);
//从上到下打印一行
for(i=top+1;i<=bottom;i++)
res.push_back(matrix[i][right]);
//从右到左打印一行
if(top<bottom)//避免这一行值重复打印
for(i=right-1;i>=left;i--)
res.push_back(matrix[bottom][i]);
//从下到上打印一行
if(left<right)//避免这一列值重复打印,例如:只有一列的情况[[1],[2],[3],[4],[5]]
for(i=bottom-1;i>top;i--)
res.push_back(matrix[i][left]);
++left;
--right;
++top;
--bottom;
}
return res;
}
int main(){
vector<vector<int> > m(5);
vector<int> res;
int k=1;
for(int i=0;i<5;i++){
m[i].push_back(k);
++k;
}
cout<<endl;
for(int i=0;i<5;i++){
cout<<m[i][0]<<" ";
}
cout<<endl;
res=printMatrix(m);
for(int i=0;i<10;i++){//设置成10的原因在于:看看有没有多打印的元素
cout<<res[i]<<" ";
}
return 0;
}
二刷
一圈一圈打印
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
//一圈一圈的打印
int row = matrix.size();
vector<int> res;
if(row == 0)
return res;
int col = matrix[0].size();
int cir = (row < col)? row : col;
for(int i = 0; i < (cir + 1) / 2; ++i){
printCircle(matrix, i, col - 2 * i, row - 2 * i, res);
}
return res;
}
private:
void printCircle(vector<vector<int>> matrix, int s, int s_c, int s_r, vector<int> &res){
int i;
//从左到右打印一行
for(i = 0; i < s_c; ++i){
res.push_back(matrix[s][s + i]);
}
//从上到下打印一列
for(i = 0; i < s_r - 1; ++i){
res.push_back(matrix[s + i + 1][s + s_c - 1]);
}
//从右到左打印一行
if(s_r > 1)
for(i = 0; i < s_c - 1; ++i){
res.push_back(matrix[s + s_r - 1][s + s_c - 1 - i - 1]);
}
//从下到上打印一行
if(s_c > 1)
for(i = 0; i < s_r - 2; ++i){
res.push_back(matrix[s + s_r - 1 - i - 1][s]);
}
}
};