笔试题解法

求一个笔试题解法
问题描述:螺旋式打印一个二维数组。如
1 16 3 2 17
8 6 4 3 23 
2 5 7 8 12
21 2 4 6 13
要求打印后顺序为:1 16 3 2 17 23 12 13 6 4 2 21 2 8 6 4 3 8 7 5

------解决方案--------------------
C/C++ code
 
#include <stdio.h>
void PrintRing( int arr[][5], int st_x, int st_y, int ed_x, int ed_y)
{
int i=st_x,j=st_y;
for( ; j <=ed_y; j++ )
{
printf("%d ",arr[i][j]); 
}
for( --j,++i; i <=ed_x; i++ )
{
printf( "%d ",arr[i][j]);
}
for( --i,--j;j>=st_y; j-- )
{
printf( "%d ",arr[i][j]);
}
for( ++j,--i;i>=st_x+1; i-- )
{
printf( "%d ",arr[i][j]);
}

}
int main()
{
int  arr[5][5]={{1,  16,  3,  2,  17 },
{8,  6,    4,  3,  23},
{2,  5,    7,  8,  12},
{21,  2,    4,  6,  13},
        {11,  111,  1111, 132,  12}};

int span=5, height = 5;

int st_x=0, st_y=0;
int ed_x=span-1, ed_y=height-1;
int circleTimes = span>height?height:span;
if( circleTimes%2 ){ circleTimes+=1;}
circleTimes/=2;
for(int i=0; i <circleTimes; i++ )
{
PrintRing(arr,st_x,st_y,ed_x,ed_y);
st_x++;
st_y++;
ed_x--;
ed_y--;
}

}

------解决方案--------------------
算法很简单啊

打印一行, 起点行加1
打印最末一列, 结尾列减1
反序打印最末一行, 末尾行减1
反序打印第一列, 起点列加1
循环