顺时针打印矩阵
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].
解题思路如下:
观察矩形 如下 看成一个圈 上行 右列 下行 左列
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
设 rowstart=0 rowend=2 colstart=0 colend=2 分别辨识行的起始、结束 和列的起始和结束
打印先从第一行开始 也就是 1 2 3 开始 此时
接着打印当前 最右边列 6 9
接着打印当前最下边行 8 7
接着打印 4
上面为一个圈,接着循环就是,直到 rowstart > rowend 或者 colstart > colend
代码如下:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> result;
if(matrix.size()==0)
return result;
int m=matrix.size()-1;
int n=matrix[0].size()-1;
int sn=0;
int sm=0;
int i;
while(true)
{
for(i=sn;i<=n;i++)
result.push_back(matrix[sm][i]);
if(++sm>m)
break;
for(i=sm;i<=m;i++)
result.push_back(matrix[i][n]);
if(--n<sn)
break;
for(i=n;i>=sn;i--)
result.push_back(matrix[m][i]);
if(--m<sm)
break;
for(i=m;i>=sm;i--)
result.push_back(matrix[i][sn]);
if(++sn>n)
break;
}
return result;
}
};
带测试的代码
#include<iostream>
using namespace std;
void printMatrix(int number[3][4],int rows,int cols)
{
int rowstart=0;
int rowend=rows-1;
int colstart=0;
int colend=cols-1;
while(rowstart<=rowend&&colstart<=colend)
{
int i;
for( i=colstart;i<=colend;i++)
{
cout<<number[rowstart][i]<<" ";
}
++rowstart;
if(rowstart>rowend)
break;
for( i=rowstart;i<=rowend;i++)
{
cout<<number[i][colend]<<" ";
}
--colend;
if(colend<colstart)
break;
for( i=colend;i>=colstart;i--)
{
cout<<number[rowend][i]<<" ";
}
--rowend;
if(rowend<rowstart)
break;
for( i=rowend;i>=rowstart;i--)
{
cout<<number[i][colstart]<<" ";
}
++colstart;
if(colstart>colend)
break;
}
}
int main()
{
int number[3][4]={1,2,3,4,10,11,12,5,9,8,7,6};
printMatrix(number,3,4);
}
原文地址:http://blog.csdn.net/yujin753/article/details/42973547