本題要求將給定的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
解題代碼:spa
#include <stdio.h> #include <stdlib.h> #include <math.h> int cmp(const void *a, const void *b){ return *((int *)b) - *((int *)a); } int set(int* data,int **res,int pos,int srow,int scol,int row,int col){ int i,j; // it need special operation if ( col == 1 ){ for ( i = srow; i < srow + row; i ++ ) res[i][scol] = data[pos++]; } else{ for ( i = scol; i < scol + col; i ++ ) res[srow][i] = data[pos++]; for ( i = srow + 1; i < srow + row - 1; i ++ ) res[i][scol+col-1] = data[pos++]; for ( i = scol+col-1; i >= scol; i -- ) res[srow+row-1][i] = data[pos++]; for ( i = srow + row - 2; i > srow; i -- ) res[i][scol] = data[pos++]; } return pos; } void print(int **res,int row, int col){ int i,j; for ( i = 0; i < row; i ++ ){ printf("%d",res[i][0]); for ( j = 1; j < col; j ++ ){ printf(" %d",res[i][j]); } printf("\n"); } } void snake(int* data,int r, int c){ int i,j; int** res; int pos = 0; int row = r,col = c; res = (int **)malloc(sizeof(int *)*row); for ( i = 0; i < row; i ++ ) res[i] = (int *)malloc(sizeof(int)*col); for ( i = 0; i <= (c-1)/2; i ++ ){ pos = set(data,res,pos,i,i,row,col); row -= 2; col -= 2; } print(res,r,c); } int main(){ int n; int row,col; int *data; int i,j; scanf("%d",&n); data = (int *)malloc(sizeof(int)*n); for ( i = 0; i < n; i ++ ) scanf("%d",&data[i]); // calculate the right row and col for ( i = 1; i <= sqrt(n); i ++ ) if (n % i == 0){ col = i; row = n / col; } qsort(data,n,sizeof(int),cmp); snake(data,row,col); return 0; }