1050. 螺旋矩阵(25)
题目地址:1050. 螺旋矩阵(25)
题目描述:
本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。
输入格式:
输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104,相邻数字以空格分隔。输出格式:
输出螺旋矩阵。每行n个数字,共m行。相邻数字以1个空格分隔,行末不得有多余空格。
程序:
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int cmp(int a, int b)
{
return a > b;
}
int ifBreak(int a, int n)
{
if (a == n)
return 1;
return 0;
}
int main()
{
int N, n, m;
cin >> N;
for (m = (int)sqrt(N); m >= 1; m--)
if (N % m == 0)
break;
n = N / m;
// 将数组非递增排序
int temp[N];
for (int k = 0; k < N; k++)
cin >> temp[k];
sort(temp, temp + N, cmp);
int Arr[n][m]; // 保存结果数组
int counter = 0; // 用于计数来中断while循环
int start = 0; // 设定起始值
int i, j;
while (counter <= N)
{
for (j = start; j <= m - 1 - start; j++)
{
if (ifBreak(counter, N))
break;
Arr[start][j] = temp[counter];
counter++;
}
j--; // 这里之所以这么写是因为j不自减的话就溢出了,下同
for (i = start + 1; i <= n - 1 - start; i++)
{
if (ifBreak(counter, N))
break;
Arr[i][j] = temp[counter];
counter++;
}
i--;
for (j = j - 1; j >= start; j--)
{
if (ifBreak(counter, N))
break;
Arr[i][j] = temp[counter];
counter++;
}
j++;
for (i = i - 1; i >= start + 1; i--)
{
if (ifBreak(counter, N))
break;
Arr[i][j] = temp[counter];
counter++;
}
i++;
if (counter == N)
{
break;
}
start++;
}
// 打印结果数组
int nn, mm;
for (nn = 0; nn < n; nn++)
{
cout << Arr[nn][0];
for (mm = 1; mm < m; mm++)
cout << " " << Arr[nn][mm];
cout << endl;
}
return 0;
}