題目描述:spa
本題要求將給定的 N 個正整數按非遞增的順序,填入「螺旋矩陣」。所謂「螺旋矩陣」,是指從左上角第 1 個格子開始,按順時針螺旋方向填充。要求矩陣的規模爲 m 行 n 列,知足條件:m×n 等於 N;m≥n;且 m−n 取全部可能值中的最小值。 輸入格式: 輸入在第 1 行中給出一個正整數 N,第 2 行給出 N 個待填充的正整數。全部數字不超過 10 4 ,相鄰數字以空格分隔。 輸出格式: 輸出螺旋矩陣。每行 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
本人AC代碼:blog
// PAT_1050_螺旋數 # include <stdio.h> # include <math.h> # include <stdlib.h> # include <algorithm> # define Max_Size 10010 # define Min_Size 100 using namespace std; int Get_n(float N) { int i; for (i=(int)sqrt(N);i>0; i--) { if ((int)N%i == 0) return i; } } int main(void) { int N; int i, j, k; int m, n; scanf("%d",&N); n = Get_n(N); m = N/n; int A[N+10]; int B[m+1][n+1]; // 初始化 for (i=0; i<m; i++) { for (j=0; j<n; j++) { B[i][j] = 0; } } for (i=0; i<N; i++) { scanf("%d",&A[i]); } sort(A,A+N); // 排序 // 開始放入 m行n列中去 i=0; j=0; k=N-1; B[i][j] = A[k--]; while (k>=0) { // 向右走 while (!B[i][j+1] && j+1<n ) { B[i][++j] = A[k--]; } // 向下走 while (!B[i+1][j] && i+1<m ) { B[++i][j] = A[k--]; } // 向左走 while (!B[i][j-1] && j-1>=0) { B[i][--j] = A[k--]; } // 向左走 while (!B[i-1][j] && i-1>=0) { B[--i][j] = A[k--]; } } for (i=0; i<m; i++) { for (j=0; j<n; j++) { printf("%d",B[i][j]); if (j<n-1) printf(" "); } printf("\n"); } return 0; }
RRR 排序