首页 > 其他 > 详细

PAT_A1105#Spiral Matrix

时间:2019-06-08 18:48:41      阅读:86      评论:0      收藏:0      [点我收藏+]

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

原文:https://www.cnblogs.com/blue-lin/p/10991319.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!