PAT-A-1050. 螺旋矩阵(25)

来源:互联网 发布:word画流程图软件 编辑:程序博客网 时间:2024/06/03 12:05

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个空格分隔,行末不得有多余空格。

输入样例:
1237 76 20 98 76 42 53 95 60 81 58 93
输出样例:
98 95 9342 37 8153 20 7658 60 76

提交代

#include<iostream>#include<cstdio>#include<math.h>#include<algorithm>using namespace std;const int maxn = 10010;int a[maxn];int b[maxn][maxn];int cmp(int a, int b){  return a > b;}int main(){  int num;  cin >> num;  for (int i = 0; i < num; i++)    cin >> a[i];  if (num == 1)  {    cout << a[0];    return 0;  }  int sqr = (int)ceil(sqrt(1.0*num));  int m = sqr;  while (num % m != 0)  {    m++;  }  int n = num / m;  sort(a, a + num, cmp);  int now = 0;  int u = 1, d = m, l = 1, r = n;  int i = 1, j = 1;  while (now < num)  {    while (j < r&&now < num)    {      b[i][j] = a[now];      now++;      j++;    }    while (i < d&&now < num)    {      b[i][j] = a[now];      now++;      i++;    }    while (j>l&&now < num)    {      b[i][j] = a[now];      now++;      j--;    }    while (i>u&&now < num)    {      b[i][j] = a[now];      now++;      i--;    }    r--;    l++;    u++;    d--;    i++;    j++;        if (now == num - 1)    {      b[i][j] = a[now];      now++;    }  }  for (int i = 1; i <= m; i++)  {    for (int j = 1; j <= n; j++)    {      cout << b[i][j];      if (j != n)        cout << " ";    }    cout << endl;  }  system("pause");  return 0;}

原创粉丝点击