PAT_A1105#Spiral Matrix

Posted blue-lin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; mn; and mn 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 

 

以上是关于PAT_A1105#Spiral Matrix的主要内容,如果未能解决你的问题,请参考以下文章

1105. Spiral Matrix (25)模拟——PAT (Advanced Level) Practise

1105. Spiral Matrix (25)模拟——PAT (Advanced Level) Practise

1105. Spiral Matrix (25)模拟——PAT (Advanced Level) Practise

1105. Spiral Matrix (25)

1105 Spiral Matrix (25分)

PAT 1105 Spiral Matrix