pta 7-29 螺旋矩阵

7-29 h0121. 螺旋矩阵

给定一个包含 N 个正整数的序列,请你将序列中的元素以非递增顺序填充到螺旋矩阵中。

从左上角的第一个元素开始填充,并按照顺时针方向旋转。

要求矩阵有 m 行 n 列,并且 m,n 满足:

m×n=N,
m≥n,
m−n 尽可能小

输入格式:

第一行包含整数 N,1≤N≤10000。

第二行包含 N 个整数,1≤ 序列中元素 ≤10000。

输入样例:

12
37 76 20 98 76 42 53 95 60 81 58 93

输出样例:

98 95 93
42 37 81
53 20 76
58 60 76

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
AC代码
  • 大体思路:第一步判断m和n,如果给出的元素个数为素数的话就一行输出。不为素数的话开方求m,n将较大的数赋给行,较小的数赋给列。第二步赋值出螺旋矩阵(借鉴了某大佬的算法),碰壁则换方向。
#include<bits/stdc++.h>
using namespace std;
int h[10010];
int q[1010][1010];
int di[4] = { 0,1,0,-1 };
int dj[4] = { 1,0,-1,0 };
void init(int x, int y)
{
	int i = 0, j = 0, d = 0;
	for (int cnt = 0; cnt < x * y; cnt++)
	{
		if (i + di[d] > x - 1 || j + dj[d] > y - 1 || j + dj[d] < 0 || q[i + di[d]][j + dj[d]])
			d = (d + 1) % 4;
		q[i][j] = h[cnt];
		i += di[d];
		j += dj[d];
	}
}
bool isprime(int n)
{
	if (n == 1) return false;
	for (int i = 2; i <=int(sqrt(n)); i++)
	{
		if (n % i == 0)
			return false;
	}
	return true;
}
bool cmp(int a, int b)
{
	return a > b;
}
int main()
{
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int n,x,y;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> h[i];
	}
	sort(h, h + n, cmp);
	if (isprime(n))
	{
		for (int i = 0; i < n; i++)
		{
			cout << h[i];
			if (i < n - 1)
				cout << " ";
		}
	}
	else
	{
		int a = int(sqrt(n));
		bool find = false;
		int b = a;
		if (a * b == n)
		{
			x=a,y=b;
		}
		else
		{
			for (int i = a; i >= 1; i--)
			{
				if (find)
					break;
				while (a * b < n)
				{
					b++;
					if (a * b == n)
					{
						find = true;
						x = b, y = a;
						break;
					}
				}
				b = a ;
			}
		}
		init(x, y);
		for (int i = 0; i < x; i++)
		{
			for (int j = 0; j < y; j++)
			{
				cout << q[i][j];
				if (j < y - 1)
					cout << " ";
			}
			cout << "\n";
		}
		
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值