每日一题(3)——打印螺旋矩阵(queue)

20 篇文章 0 订阅
6 篇文章 0 订阅

要求打印螺旋矩阵:

输入边长,输出样式如下:

总结规律:

可以看出,旋转方向是:右,下,左,上;

具体次数:右,下,;左左,上上,;右右右,下下下,;左左左左,上上上上……每两次输出次数(旋转半径)递增1

有了这些规律,就可以总结使用了

(PS:注意容器适配器queue的用法)

#include <iostream>
#include <queue>
#include <utility>
using namespace std;

queue <pair<int,int>> mov;
int a[100][100];

//移动方向存在容器适配器队列中;
void IntialQueue()
{
	mov.push(make_pair(0,1));//right
	mov.push(make_pair(1,0));//down
	mov.push(make_pair(0,-1));//left
	mov.push(make_pair(-1,0));//up
}

void PrintMat(int s)
{
	int sum= s*s;
	int x=(s-1)/2, y=(s-1)/2;//注意起始位置,不然会出现偶数边长输出为零;
	a[x][y] = 1;
	int current = 2;
	if(current>sum) return;
	int radius=1, addradius=1; //radius: 每次旋转的边长; addradius:边长递增值;


	pair<int ,int> tmp;
	
	while(1)
	{
		for(int i=0; i<radius&¤t<=sum; i++) //current<=sum 注意是 "<="
		{
			x+=mov.front().first;
			y+=mov.front().second;
			a[x][y]=current;
			current++;
		}
		if(current>sum) return;
		//每两步更新一次radius长度;
		addradius = (addradius+1)%2;
		radius += addradius;
		
		tmp = mov.front();
		mov.pop();
		mov.push(tmp);
	}


}

int main()
{
	int n;
	cin>>n;
	IntialQueue();
	PrintMat(n);

	for (int i=0; i<n; i++)
	{	
		for(int j=0; j<n; j++)
		{
			if(a[i][j]<10)cout<<" ";//对齐;
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}

}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值