通常当我们遇到一个复杂的问题的时候,我们可以用图形帮助我们思考。由于我们是以从外圈到内圈的顺序依次打印,我们在矩阵中标注一圈作为我们分析的目标。在下图中,我们设矩阵的宽度为columns,而其高度为rows。我们我们选取左上角坐标为(startX, startY)。我们可以想象有一个循环,在每一次循环里我们从(startX, startY)出发按照顺时针打印数字。
接着我们分析这个循环结束的条件。对一个5×5的矩阵而言,最后一圈只有一个数字,对应的坐标为(2, 2)。我们发现5 > 2 * 2。对一个6×6的矩阵而言,最后一圈有四个数字,对应的坐标仍然为(2, 2)。我们发现6 > 2 * 2依然成立。于是我们可以得出,让循环继续的条件是columns > startX * 2 && rows > startY * 2。有了这些分析,我们就可以写出如下的代码:
#include <iostream>
using namespace std;
void Print(int num[][4], int rows, int cols, int start)
{
int i;
//shang
for(i=start; i<cols-start; i++)
cout<<num[start][i]<<endl;
//you
for(i=start+1; i<rows-start; i++)
cout<<num[i][cols - start-1]<<endl;
//xia
for(i=cols-start-2; i>=start; i--)
cout<<num[rows-start-1][i]<<endl;
//zuo
for(i=rows-start-2; i>start; i--)
cout<<num[i][start]<<endl;
}
void PrintMatrix(int num[][4], int rows, int cols)
{
if(num==NULL || rows<=0 || cols<=0)
return;
int start = 0;
while(rows > start*2 && cols > start*2)
{
Print(num, rows, cols, start);
start++;
}
}
int main()
{
int in[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
PrintMatrix(in, 4, 4);
return 0;
}