螺旋矩阵问题

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值