一、题目概述
要求:
1、据给定N, 找到m、n使得m * n = N, 且m-n的值最接近0;
2、使用N个元素构造m x n的螺旋矩阵, 元素降序。
二、思路
1、m、n的选择:n取不大于根号N,且能被N整除的最大值, m = N / n。
for( n = sqrt(N); N % n; --n );
m = N / n;
2、矩阵的构造:width、height控制高度和宽度, l为步长,flag控制方向。
for(int i = 0, j = -1, k = 0, w = n, h = m; k < N;)
{
for(int l = 0; l < w && k < N; ++l)
ans[i][++j] = a[k++];
--h;
for(int l = 0; l < h && k < N; ++l)
ans[++i][j] = a[k++];
--w;
for(int l = 0; l < w && k < N; ++l)
ans[i][--j] = a[k++];
--h;
for(int l = 0; l < h && k < N; ++l)
ans[--i][j] = a[k++];
--w;
}
三、代码
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
int N, m, n;
scanf("%d", &N);
n = (int)sqrt((double)N);
while(N % n)
--n;
m = N / n;
int a[N], ans[m][n] = {0};
for(int i = 0; i < N; ++i)
scanf("%d", &a[i]);
sort(a, a + N, [](int a, int b){return a > b;});
for(int i = 0, j = -1, k = 0, w = n, h = m; k < N;)
{
for(int l = 0; l < w && k < N; ++l)
ans[i][++j] = a[k++];
--h;
for(int l = 0; l < h && k < N; ++l)
ans[++i][j] = a[k++];
--w;
for(int l = 0; l < w && k < N; ++l)
ans[i][--j] = a[k++];
--h;
for(int l = 0; l < h && k < N; ++l)
ans[--i][j] = a[k++];
--w;
}
for(int i = 0; i < m; ++i)
for(int j = 0; j < n; ++j)
printf("%d%s", ans[i][j], j + 1 == n ? "\n":" ");
}