您的位置:首页 > 其它

1050. 螺旋矩阵(25)

2017-10-07 10:13 190 查看
题目链接

题目:

本题要求将给定的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


题解:

把待输出的矩阵预处理一下放到m*n的二维数组中。

代码:

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 10010;
int matrix[maxn][maxn], A[maxn];
bool cmp (int a, int b){
return a > b;
}

int main() {
int N;
scanf("%d", &N);
for(int i = 0; i < N; i++) {
scanf("%d", &A[i]);
}
if(N == 1){
printf("%d", A[0]);
return 0;
}
sort(A, A + N, cmp);
int m = (int)ceil(sqrt(1.0 * N));
while(N % m != 0)
m++;
int n = N / m, i = 1, j = 1, now = 0;
int U = 1, D = m, L = 1, R = n;
while(now < N){
while(now < N && j < R)
matrix[i][j++] = A[now++];

while(now < N && i < D)
matrix[i++][j] = A[now++];

while(now < N && j > L)
matrix[i][j--] = A[now++];

while(now < N && i > U)
matrix[i--][j] = A[now++];
U++, D--, L++, R--;
i++, j++;
if(now == N - 1)
matrix[i][j] = A[now++];
}

for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
printf("%d",matrix[i][j]);
if(j < n) printf(" ");
else printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: