面试题20:顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入以下矩阵:
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.
#define ROW 4
#define COL 4
//一次打印一圈
void PrintMatrixInCirclie(int **arr,int row,int col,int start)
{
int endX = col-1-start;
int endY = row-1-start;
//从左往右打印
for(int i=start;i<=endX;++i)
{
cout<<arr[start][i]<<" ";
}
if(start < endY)
{
//从上往下打印
for(int i=start+1;i<=endY;++i)
{
cout<<arr[i][endX]<<" ";
}
}
if(start<endX && start<endY)
{
//从右往左打印
for(int i=endX-1;i>=start;--i)
{
cout<<arr[endY][i]<<" ";
}
}
if(start<endX && start<endY-1)
{
//从下往上打印
for(int i=endY-1;i>=start+1;--i)
{
cout<<arr[i][start]<<" ";
}
}
}
//从外向内顺时针打印矩阵
void PrintMatrixClockwisely(int **arr,int rows,int cols)
{
if(arr==NULL || rows<=0 || cols<=0)
return;
int start = 0;
while(rows>start*2 && cols>=start*2)
{
PrintMatrixInCirclie(arr,rows,cols,start);
++start;
}
}
//从内向外顺时针打印矩阵
void PrintMatrix(int **arr,int rows,int cols)
{
if(arr==NULL || rows<=0 || cols<=0)
return;
int start = ROW/2;
while(start>=0 && cols>=0)
{
PrintMatrixInCirclie(arr,rows,cols,start);
--start;
}
}
int main()
{
int count = 1;
int **arr = new int *[ROW];
for(int i=0;i<ROW;i++)
{
arr[i] = new int[COL];
for(int j=0;j<COL;j++)
{
arr[i][j] = count++;
}
}
cout<<"从外向内顺时针打印矩阵:"<<endl;
PrintMatrixClockwisely(arr,ROW,COL);
cout<<endl;
cout<<"从内向外顺时针打印矩阵:"<<endl;
PrintMatrix(arr,ROW,COL);
}