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;
}