本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。
输入格式:
输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 104,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。
输入样例:
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
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define DOWN 1
#define UP 2
#define LEFT 3
#define RIGHT 4
int Cmp(const void* num1, const void* num2)
{
return *(int*)num1 - *(int*)num2;
}
int main()
{
int i, j, n, flag = RIGHT;
int col = 0, row = 0, max = 0, num[100][100] = { 0 }, p[100] = { 0 };//ӦΪnum[10000][100]
scanf("%d", &n);
for (i = (int)sqrt(n); i <= n; i++)
{
if (n % i == 0)
{
if (i > n / i)
{
row = i;
col = n / i;
}
else
{
row = n / i;
col = i;
}
break;
}
}
for (i = 0; i < n; i++)
scanf("%d", &p[i]);
qsort(p, n, sizeof(p[0]), Cmp);
for (n = n - 1, i = 0, j = 0; n >= 0; n--)
{
num[i][j] = p[n];
if (flag == DOWN)
{
i++;
if (i == row || (i < row && num[i][j] != 0))
{
flag = LEFT;
i--;
j--;
}
}
else if (flag == LEFT)
{
j--;
if (j < 0 || (j >= 0 && num[i][j] != 0))
{
flag = UP;
j++;
i--;
}
}
else if (flag == UP)
{
i--;
if (i < 0 || (i >= 0 && num[i][j] != 0))
{
flag = RIGHT;
i++;
j++;
}
}
else if (flag == RIGHT)
{
j++;
if (j == col || (j < col && num[i][j] != 0))
{
flag = DOWN;
j--;
i++;
}
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf("%d", num[i][j]);
if (j != col - 1)
putchar(' ');
}
putchar('\n');
}
system("pause");
return 0;
}