Source:
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 }