输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
先上答案,再分析:
void PrintMatrixClockwisely(int** numbers,int columns,int rows)
{
if(numbers==nullptr||columns<=0||rows<=0)
return;
int start=0;
while(columns>start *2&&rows>start *2)
{
PrintMatrixInCircle(numbers,columns,rows,start);
++start;
}
}
思路:方法PrintMatrixInCircle等会再实现,从上面这波操作来看,先是鲁棒性检测,然后定义了一个start,初始为0。判断依据是行列数都要大于start的两倍,每次循环都换自增的start。这是何解呢?如果刚好是方阵,那么最后的内圈刚好是4个,从那么内圈的左上角的坐标的xy都不过行列数的一半。其实到这应该换个角度想想,一个矩阵,我只要知道其矩阵的左上角的子矩阵(行列各取一半,取底),那么再通过矩阵的行列数,就可以把矩阵整个还原出来。那么根据(start,start)作为每次循环的起点,知道这次循环行列数,不就可以控制循环了么?
那么循环代码如下:
void PrintMatrixInCircle(int** numbers,int columns,int rows,int start)
{
int endX=columns-1-start;
int endY=rows-1-start;
//从左至右打印一行
for(int i=start;i<=endX;i++)
{
int number=numbers[start][i];
printNumber(bynver);
}
//从上到下打印一列
if(start<endY)
{
for(int i=start+1;i<=endY;++i)
{
int
number=numbers[i][endX];
printNumber(number);
}
}
//从右到左打印一行
if(start<endX&&start<endY)
{
for(int i=endX-1;i>=start;--i)
{
int
number=numbers[endY][i];
printNumber(number)
}
}
//从下到上打印一列
if(start<endX&&start<endY-1)
{
for(int i=endY-1;i>=start+1;--i)
{
int
number=numbers[i][start];
printNumber(number);
}
}
}