很久以前参加一个公司的面笔试,其中有一道题是输出螺旋矩阵,当时毫无头绪,没有做出来,于是就搁置了。几天碰巧又遇到了,于是想了一会儿,发现只要找到规律,该问题相当简单,控制好转向条件即可。
说一下思路:假如从1-n正整数作为数据元素,顺时针从左上角开始,设定一个字段orien,标识填充要推进的方向,然后设定四个方向的边界值,第一行为上边界,最后一行为下边界,最左边列作为左边界值,最右边列作为右边界值,然后分为四个条件考虑:
A. 当前向右:判断当前横坐标,如果等于右边界值,则改变方向向下,上边界值+1,否则继续向右推进;
B. 当前向下:判断当前纵坐标,如果等于下边界值,则改变方向向左,右边界值-1,否则继续向下推进;
C. 当前向左:判断当前横坐标,如果等于左边界值,则改变方向向上,下边界值-1,否则继续向左推进;
D. 当前向上:判断当前纵坐标,如果等于上边界值,则改变方向向右,左边界值+1,否则继续向上推进;
void RotationMatrix(int r,int c)
{
//r代表行数,c代表列数
char orien='R'; //L-left 向左,R-right 向右,U-up 向上,D-down 向下
int currentrow=0; //当前行
int currentcol=0; //当前列
int bound_left=0;//左边界
int bound_right=c-1;//右边界
int bound_top=0;//上边界
int bound_bottom=r-1;//下边界
int index=1;
int arr[Maxsize][Maxsize];
for(;index<=r*c;index++)
{
arr[currentrow][currentcol]=index;
if(orien=='R')
{
//向右推进
if(currentcol==bound_right)
{
bound_top++;
orien='D';
currentrow++;
}
else
currentcol++;
}
else if(orien=='D')
{
//向下推进
if(currentrow==bound_bottom)
{
bound_right--;
orien='L';
currentcol--;
}
else
currentrow++;
}
else if(orien=='L')
{
//向左推进
if(currentcol==bound_left)
{
bound_bottom--;
orien='U';
currentrow--;
}
else
currentcol--;
}
else
{
//向上推进
if(currentrow==bound_top)
{
bound_left++;
orien='R';
currentcol++;
}
else
currentrow--;
}
}
printf("螺旋矩阵如下:\n");
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
printf("%03d ",arr[i][j]);
}
printf("\n");
}
}
样例:
输入10行*10列