分析:把矩阵想象成若干个圈,用一个循环打印矩阵,每次打印矩阵的一个圈
#include "stdafx.h"
#include <iostream>
using namespace std;
void PrintMatrixIncircle(int **nArr, int rows, int columns, int nStart)
{
int nEndX = columns - 1 -nStart;
int nEndY = rows - 1 -nStart;
//从左到右打印一行
for (int i=nStart; i<=nEndX; i++)
{
cout << nArr[nStart][i] << " ";
}
//从上到下打印一列
if (nEndY > nStart)
{
for (int j=nStart+1; j<=nEndY; j++)
{
cout << nArr[j][nEndX] << " ";
}
}
//从右到左打印一行
if (nEndY > nStart && nEndX > nStart)
{
for (int t=nEndX-1; t>=nStart; t--)
{
cout << nArr[nEndY][t] << " ";
}
}
//从下到上打印一列
if (nEndY -1 > nStart && nEndX > nStart)
{
for (int n=nEndY-1; n>=nStart+1; n--)
{
cout << nArr[n][nStart] << " ";
}
}
}
//顺时针打印矩阵,行数为rows,列数为columns
void PrintMatrixClockWisely(int **nArr, int rows, int columns)
{
if (nArr == NULL || rows <= 0 || columns <= 0)
{
return;
}
int nStart = 0;
while (rows>(nStart*2) && columns>(nStart*2))
{
PrintMatrixIncircle(nArr, rows, columns, nStart);
nStart++;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int nMatrix1[4][4] = {{1,2,3,4},{5, 6, 7, 8},{9, 10, 11, 12},{13, 14, 15, 16}};
int **pp1 = new int*[4];
for (int i=0; i<4; i++)
{
pp1[i] = nMatrix1[i];
}
PrintMatrixClockWisely(pp1, 4, 4);
cout << endl;
int nMatrix2[1][4] = {{1,2,3,4}};
int **pp2 = new int*[1];
for (int i=0; i<1; i++)
{
pp2[i] = nMatrix2[i];
}
PrintMatrixClockWisely(pp2, 1, 4);
cout << endl;
int nMatrix3[4][1] = {{1},{2},{3},{4}};
int **pp3 = new int*[4];
for (int i=0; i<4; i++)
{
pp3[i] = nMatrix3[i];
}
PrintMatrixClockWisely(pp3, 4, 1);
cout << endl;
int nMatrix4[2][5] = {1,2,3,4,5,6,7,8,9,10};
int **pp4 = new int*[2];
for (int i=0; i<2; i++)
{
pp4[i] = nMatrix4[i];
}
PrintMatrixClockWisely(pp4, 2, 5);
cout << endl;
system("pause");
return 0;
}
运行结果: