1. 程式人生 > >1050. 螺旋矩陣(25)

1050. 螺旋矩陣(25)

i++ ron OS pos std 格子 整數 () 順序

本題要求將給定的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

螺旋數組的意思是這樣子

技術分享圖片

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include<string.h>
 4 #include<math.h>
 5 int ans[10002][10002];
 6 int a[10002];
 7 int cmp( const void *a, const void *b)
 8 {
 9     return *(int *)b -*( int *)a;
10 }
11 int main()
12 {
13     int N,r,c,min=999999;
14     int i,j,k;
15 scanf("%d",&N); 16 for( i=0; i<N; i++) 17 scanf("%d",&a[i]); 18 qsort( a, N,sizeof( a[1]),cmp); //降序排列 19 int n = (int )sqrt(N*1.0); 20 for( i=1; i<=n; i++) //i循環表示列數,行數大於列數,只需循環N的開方次 21 { 22 if( N%i==0 && (N/i-i < min) ) 23 { 24 min = N/i-i;
25 r = i; //r列 26 } 27 } 28 c = N/r; //c行 29 ans[0][0]=a[0]; //初始化第一位數 30 i=j=k=0; 31 while( k<N-1) 32 { 33 while( j+1<r && !ans[i][j+1]) //向左 34 ans[i][++j] = a[++k]; 35 while( i+1<c && !ans[i+1][j]) //向下 36 ans[++i][j] = a[++k]; 37 while(j-1>=0 && !ans[i][j-1])//向右 38 ans[i][--j] = a[++k]; 39 while( i-1>=0 && !ans[i-1][j]) //向上 40 ans[--i][j] = a[++k]; 41 } 42 for( i=0; i<c; i++) 43 { 44 printf("%d",ans[i][0]); 45 for( j=1; j<r; j++) 46 printf(" %d",ans[i][j]); 47 printf("\n"); 48 } 49 return 0; 50 }

1050. 螺旋矩陣(25)