其实这个题目,我要讲的并不是这个题目的编码过程,而是对于这个问题解决过程:
我们不能遇到这个问题之后立即编码是错误的,然而立即拿出笔在纸上写写画画时,也是需要进行技巧的,针对这个问题,我们首先看看顺时针时,走一圈作为一个循环,然而该
循环的起点是很有意思的,这个点的所在的点行坐标和列坐标是相同的
也即是双层循环的,一层内部循环是要进行四个方向的的遍历。从左到右 从上到下 从右到左 从下到上
void PrintInnerLoop(int** a,int rows,int colnums,int start)
{
//内层输出一个小的循环,值得是一圈
if(NULL==a)
return;
//重新定位行和列的结束为止
int endX=rows-1-start;
int endY=colnums-1-start;
//开始进行输出,
//从左到右,不变的是行值 为start
for(int i=start;i<=endX;i++)
{
cout<<a[start][i]<<" ";
}
//从上到下,不变的是列值,为endY
if(endY>start)
{
for(int i=start+1;i<=endX;i++)
{
cout<<a[i][endX]<<" ";
}
}
//从右到左,确定的是行值 endX
if(start<endY)
{
for(int i=endY-1;i>=start;i--)
{
cout<<a[endY][i]<<" ";
}
}
//从下到上 不变的是列值start
if(start<endX)
{
for(int i=endX-1;i>start;i--)
{
cout<<a[i][start]<<" ";
}
}
cout<<endl;
}
void printOutLop(int** const a,int rows,int colnums)
{
if(NULL==a)
{
return;
}
int start=0;
//首先确定
while(colnums>start*2&&rows>=start*2)
{
PrintInnerLoop(a,rows,colnums,start);
start++;
}
}
我的经验是首先在纸上画出在一个循环的时候,标出四个点的坐标所在,在进行内层循环的时候可以方便的进行边界