1050 螺旋矩阵(25)(25 分)
本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。
输入格式:
输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过10^4^,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行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
这个有一个大坑 我写在 博客里了《memset 和 二维数组之间个“隔阂”》
剩下的 就是一些正常的模拟
1.先排序
2.在开相应的二维数组的空间
3.然后再模拟输入
4.最后在输出出来就完成了这道题目
AC代码 : (如有雷同 一定是巧合~ 我还真的发现了和我写的差不多的 哈哈哈)
#include <bits/stdc++.h>
using namespace std;
int cmp(int x, int y) {
return x > y;
}
void solve() {
int SN[100000];
int x;
scanf("%d", &x);
for (int i = 0;i<x;i++) {
scanf("%d",&SN[i]);
}
sort(SN, SN+x, cmp);
int hang = 1, lie = 1;
{
int minst = x;
for (int i = 1; i <= x; i++) {
int j = x / i;
if (i*j == x && i - j < minst &&j <= i)
minst = i - j, hang = i, lie = j;
}
}
int** P = (int **)calloc(hang,sizeof(int *));
for (int i = 0; i<hang; i++)
P[i] = (int *)calloc(lie,sizeof(int));
int i = 0, j = 0, k = 0;
for(P[i][j] = SN[k++];k<x;){
while (j + 1<lie && !P[i][j + 1])
P[i][++j] = SN[k++];
while (i + 1<hang && !P[i + 1][j])
P[++i][j] = SN[k++];
while (j - 1 >= 0 && !P[i][j - 1])
P[i][--j] = SN[k++];
while (i - 1 >= 0 && !P[i - 1][j])
P[--i][j] = SN[k++];
}
for (int i = 0; i < hang; i++)
for (int j = 0; j < lie; j++)
j == lie-1 ? printf("%d\n", P[i][j]) : printf("%d ", P[i][j]);
}
int main() {
solve();
return 0;
}
现在时间 2018年6月15日22:10:20