螺旋矩阵问题
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列
说一下思路:假如从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列
相关文章推荐
- 螺旋矩阵问题
- 蓝桥杯中的螺旋矩阵问题
- 数学问题(二)螺旋矩阵
- 螺旋矩阵问题求解
- 递归:求螺旋排列数字的矩阵
- 脑洞脑洞 螺旋矩阵
- 关于Mat矩阵在浅拷贝下的关于矩阵头的拷贝问题
- 2017.4.21 螺旋矩阵 思考记录
- 螺旋矩阵 解法
- Pascal 语言中二维数组:矩阵问题
- 螺旋矩阵
- 矩阵连乘问题
- Python科学计算库Numpy里meshgrid用法及矩阵向量合并问题
- 数学之美 系列十八 - 矩阵运算和文本处理中的分类问题
- 51Nod 1084 矩阵取数问题 V2(多线程dp)
- 动态规划算法——矩阵连乘问题(java实现)
- B1050. 螺旋矩阵(25)
- 算法设计与分析--矩阵连乘顺序问题…
- 打印螺旋数字矩阵
- 为工作流设计矩阵数据结构存在的问题[2013.6.27更新]