This time your job is to fill a sequence of N positive integers into a spiral matrix in non-increasing order. A spiral matrix is filled in from the first element at the upper-left corner, then move in a clockwise spiral. The matrix has m rows and n columns, where m and n satisfy the following: m*n must be equal to N; m>=n; and m-n is the minimum of all the possible values.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N. Then the next line contains N positive integers to be filled into the spiral matrix. All the numbers are no more than 104. The numbers in a line are separated by spaces.
Output Specification:
For each test case, output the resulting matrix in m lines, each contains n numbers. There must be exactly 1 space between two adjacent numbers, and no extra space at the end of each line.
Sample Input:
12
37 76 20 98 76 42 53 95 60 81 58 93
Sample Output:
98 95 93
42 37 81
53 20 76
58 60 76
AC代码
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
vector<int> num;
vector<vector<int>> Matrix;
static int cnt = 0;
//寻找最大的矩阵列数
int findcolomn(int N)
{
int n = sqrt(N);
while (int(N / n) != double(N * 1.0 / n)) n--;
return n;
}
//从最外层开始,递归填入矩阵
void spiral(int top, int bottom, int left, int right)
{
//递归结束条件
if (left > right) return;
for (int i = left; i <= right; ++i)
Matrix[top][i] = num[::cnt++];
for (int i = top + 1; i <= bottom; ++i)
Matrix[i][right] = num[::cnt++];
for (int i = right - 1; i >= left; --i)
Matrix[bottom][i] = num[::cnt++];
if (left < right)//避免重复填充
{
for (int i = bottom - 1; i > top; --i)
Matrix[i][left] = num[::cnt++];
}
//填入下一层矩阵
spiral(top + 1, bottom - 1, left + 1, right - 1);
}
int main()
{
int N, m, n;
cin >> N;
n = findcolomn(N);
m = N / n;
num.resize(N);
Matrix.resize(m);
for (int i = 0; i < m; i++)
Matrix[i].resize(n);
for (int i = 0; i < N; ++i)
cin >> num[i];
sort(num.begin(), num.end(), greater<>());
spiral(0, m - 1, 0, n - 1);
//输出矩阵
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
if (j != 0) cout << " ";
cout << Matrix[i][j];
}
cout << endl;
}
}