1050 螺旋矩陣
阿新 • • 發佈:2018-11-17
1050 螺旋矩陣 (25 分)
本題要求將給定的 N 個正整數按非遞增的順序,填入“螺旋矩陣”。所謂“螺旋矩陣”,是指從左上角第 1 個格子開始,按順時針螺旋方向填充。要求矩陣的規模為 m 行 n 列,滿足條件:m×n 等於 N;m≥n;且 m−n 取所有可能值中的最小值。
輸入格式:
輸入在第 1 行中給出一個正整數 N,第 2 行給出 N 個待填充的正整數。所有數字不超過 104,相鄰數字以空格分隔。
輸出格式:
輸出螺旋矩陣。每行 n 個數字,共 m 行。相鄰數字以 1 個空格分隔,行末不得有多餘空格。
輸入樣例:
12 37 76 20 98 76 42 53 95 60 81 58 93
輸出樣例:
98 95 93
42 37 81
53 20 76
58 60 76
#include <cstdio> #include <algorithm> using namespace std; int cmp(int a, int b){ return a > b; } int main() { int N = 0, a[10010]; scanf("%d", &N); for (int i = 0; i < N; i++){ scanf("%d", &a[i]); } sort(a, a + N,cmp); int m = 0, n = 0, min=10000000, x = 0, y = 0; for (int i = 1; i <= N; i++){ x = i; y = N / x; if (x * y == N && x - y < min&&x >= y){ m = x, n = y; min = x - y; } } int m1 = 0, n1 = 0, arr = 0, c[10000][200], m2 = m, n2 = n; //二維陣列行數一定要為10010,不然在提交時會提示段錯誤,太大也會提示段錯誤 while (arr < N) { for (int i = n1; i < n&&arr<N; i++) { c[m1][i] = a[arr]; arr++; } m1++; for (int i = m1; i < m&&arr<N; i++) { c[i][n-1] = a[arr]; arr++; } n--; for (int i = n - 1; i >= n1&&arr<N; i--) { c[m-1][i] = a[arr]; arr++; } m--; for (int i = m - 1; i >= m1&&arr<N; i--) { c[i][n1] = a[arr]; arr++; } n1++; } for (int i = 0; i < m2; i++) { for (int j = 0; j < n2; j++) { printf("%d", c[i][j]); if (j != n2 - 1) printf(" "); } printf("\n"); } }