1050. 螺旋矩阵(25)
Posted yuxiaoba
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
螺旋数组的意思是这样子
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)的主要内容,如果未能解决你的问题,请参考以下文章