PAT_A1105#Spiral Matrix

Source:

PAT A1105 Spiral Matrix (25 分)

Description:

This time your job is to fill a sequence of N positive integers into a spiral matrix in non-increasing order. A spiral matrix is filled in from the first element at the upper-left corner, then move in a clockwise spiral. The matrix has m rows and n columns, where m and n satisfy the following: m×nmust be equal to N; m≥n; and m−n is the minimum of all the possible values.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N. Then the next line contains N positive integers to be filled into the spiral matrix. All the numbers are no more than 1. The numbers in a line are separated by spaces.

Output Specification:

For each test case, output the resulting matrix in m lines, each contains n numbers. There must be exactly 1 space between two adjacent numbers, and no extra space at the end of each line.

Sample Input:

12
37 76 20 98 76 42 53 95 60 81 58 93

Sample Output:

98 95 93
42 37 81
53 20 76
58 60 76

Keys:

  • 简单模拟

Attention:

  • 基本思路就是把序列按照从大到小的顺序,依次填入矩阵中;
  • 直接开1e4的矩阵会超出内存,而且样例中存在m较大,n较小的情况,因此用一维数组代替二维数组
  • 循环内的四个for循环需要判断pt<N

Code:

 1 /*
 2 Data: 2019-06-08 16:12:47
 3 Problem: PAT_A1105#Spiral Matrix
 4 AC: 01:05:29
 5 
 6 题目大意:
 7 序列从大到小,顺时针放入矩阵中
 8 */
 9 #include<functional>
10 #include<cstdio>
11 #include<cmath>
12 #include<algorithm>
13 using namespace std;
14 const int M=1e4+10;
15 int matrix[M], a[M];
16 
17 int main()
18 {
19 #ifdef    ONLINE_JUDGE
20 #else
21     freopen("Test.txt", "r", stdin);
22 #endif
23 
24     int N,n,m;
25     scanf("%d", &N);
26     for(int i=0; i<N; i++)
27         scanf("%d", &a[i]);
28     for(int i=(int)sqrt((double)N); i>=1; i--)
29     {
30         if(N%i == 0)
31         {
32             n = i;
33             m = N/i;
34             break;
35         }
36     }
37     sort(a,a+N,greater<int>());
38     fill(matrix,matrix+M,0);
39     int pt=0,c=1,r=1,R=m,C=n;
40     while(pt < N)
41     {
42         for(int i=c; i<=n && pt<N; i++)
43             matrix[C*r-2+i-1]=a[pt++];
44         r++;
45         for(int i=r; i<=m && pt<N; i++)
46             matrix[C*i-2+n-1]=a[pt++];
47         n--;
48         for(int i=n; i>=c && pt<N; i--)
49             matrix[C*m-2+i-1]=a[pt++];
50         m--;
51         for(int i=m; i>=r && pt<N; i--)
52             matrix[C*i-2+c-1]=a[pt++];
53         c++;
54     }
55     for(int i=1; i<=R; i++)
56         for(int j=1; j<=C; j++)
57             printf("%d%c", matrix[C*i-2+j-1], j==C?'\n':' ');
58 
59 
60     return 0;
61 }

 

上一篇:Point on Spiral(codeforces 279A)


下一篇:Boost:异步操作,需要boost :: asio :: async_compose函数的测试程序