您的位置:首页 > 其它

螺旋矩阵问题

2014-02-27 16:39 218 查看
很久以前参加一个公司的面笔试,其中有一道题是输出螺旋矩阵,当时毫无头绪,没有做出来,于是就搁置了。几天碰巧又遇到了,于是想了一会儿,发现只要找到规律,该问题相当简单,控制好转向条件即可。

说一下思路:假如从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列

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 程序设计