1105 Spiral Matrix (25分)

    技术2022-07-10  135

    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×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 10​4​​. 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

     

     题解:

    #include <iostream> #include <vector> #include <algorithm> #include <functional> using namespace std; const int N = 10010; int n, w[N]; int main() { cin >> n; for (int i = 0; i < n; i++) cin >> w[i]; sort(w, w + n, greater<int>()); int r, c; for (int i = 1; i <= n / i; i++) { if (n%i == 0) { r = n / i; c = i; } } vector<vector<int>> res(r, vector<int>(c)); int dx[] = { -1,0,1,0 }, dy[] = { 0,1,0,-1 }; for (int i = 0, x = 0, y = 0, d = 1; i < n; i++) { res[x][y] = w[i]; int a = x + dx[d], b = y + dy[d]; if (a < 0 || a >= r || b < 0 || b >= c || res[a][b]) { d = (d + 1) % 4; a = x + dx[d], b = y + dy[d]; } x = a, y = b; } for (int i = 0; i < r; i++) { cout << res[i][0]; for (int j = 1; j < c; j++) cout << ' ' << res[i][j]; cout << endl; } return 0; }

     

    Processed: 0.013, SQL: 9