您的位置:首页 > 其它

1050. 螺旋矩阵(25)

2017-10-26 23:32 316 查看


1050. 螺旋矩阵(25)

时间限制

150 ms

内存限制

65536 kB

代码长度限制

8000 B

判题程序

Standard

作者

CHEN, Yue

本题要求将给定的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<iostream>
#include<cstdio>
#include<string>
#include<fstream>
#include<cstdlib>
#include<iomanip>
#include<sstream>
#include<algorithm>
#include<cmath>
using namespace std;

bool cmp(const int a, const int b) {
return a>b;
}

int main() {
int N, m, n;
int data[50000];//这个弄大点。。最后两个段错误是因为这个。
bool tag = true;
cin >> N;

//计算因数
for (n = (int)sqrt(N); tag; n--) {
for (m = (int)sqrt(N); m<=N; m++) {
if (m*n == N) {
tag = false;
++n;//退出外圈循环时n还会-1
break;
}
}
}

//输入数据&排序
for (int i = 0; i<N; i++)
cin >> data[i];
sort(data, data + N, cmp);

int left = 0, right = n, up = 0, down = m;//上下左右边界
int counter = 0;//输出计数

//分配矩阵内存
int **a = new int*[m];
for (int i = 0; i < m; i++)
a[i] = new int
;

while (counter<N) {
for (int i = left; i<right; i++) {//输出在最上边
a[up][i] = data[counter];
counter++;
}
up++;
if (counter >= N)//每一次边界改动都要检查是否输出完成。
break;

for (int i = up; i<down; i++) {//输出在最右边
a[i][right - 1] = data[counter];
counter++;
}
right--;
if (counter >= N)
break;

for (int i = right - 1; i >= left; i--) {//输出在最下边
a[down - 1][i] = data[counter];
counter++;
}
down--;
if (counter >= N)
break;

for (int i = down - 1; i >= up; i--) {//输出在最左边
a[i][left] = data[counter];
counter++;
}
left++;
if (counter >= N)
break;
}
int i, q;
for (i = 0; i<m; i++) {
for (q = 0; q<n - 1; q++) {
cout << a[i][q] << " ";
}
cout << a[i][q]; //最后一个数单独输出 避免行末空格
cout << endl;
}
cin.get();
cin.get();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: