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 ncolumns, where m and n satisfy the following: m*n must 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 104. 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 93Sample Output:
98 95 93 42 37 81 53 20 76 58 60 76
#include<iostream> #include<stdio.h> #include<vector> #include<algorithm> #include<math.h> using namespace std; int main(){ for (int N; scanf("%d", &N) != EOF;){ vector<int>vec(N); for (int i = 0; i < N; i++){ scanf("%d", &vec[i]); } sort(vec.begin(), vec.end()); int m = sqrt(N); int n = sqrt(N); while (m*n != N){ m++; n = N / m; } int count = vec.size() - 1; vector<int>vec_out(N); int start_i = 0, start_j = 0; int end_i = m, end_j = n; //每次一圈矩形打印 while (end_i >= start_i && end_j >= start_j){ int i = start_i, j = start_j; while (j < end_j){ vec_out[i*n + j] = vec[count]; count--; j++; } j--; i++; while (i < end_i){ vec_out[i*n + j] = vec[count]; count--; i++; } i--; j--; //<span style="font-family: 'Droid Sans Mono', Consolas, 'Courier New', monospace;">(end_i - start_i) > 1</span>只有一行的情况 while (j >= start_j && (end_i - start_i) > 1){ vec_out[i*n + j] = vec[count]; count--; j--; } j++; i--; //<span style="font-family: 'Droid Sans Mono', Consolas, 'Courier New', monospace;">(end_j - start_j) > 1</span><span style="font-family: 'Droid Sans Mono', Consolas, 'Courier New', monospace;">只有一列的情况</span> while (i > start_i && (end_j - start_j) > 1){ vec_out[i*n + j] = vec[count]; count--; i--; } start_i++; start_j++; end_i--; end_j--; } for (int i = 0; i < m; i++){ cout << vec_out[i*n]; for (int j = 1; j < n; j++){ cout << " " << vec_out[i*n + j]; } cout << endl; } } return 0; }