首页 > 代码库 > 1050. 螺旋矩阵(25)
1050. 螺旋矩阵(25)
本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。
输入格式:
输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行n个数字,共m行。相邻数字以1个空格分隔,行末不得有多余空格。
输入样例:
1237 76 20 98 76 42 53 95 60 81 58 93
输出样例:
98 95 9342 37 8153 20 7658 60 76
code:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include <string.h> 5 6 int cmp(const void *a,const void *b) 7 { 8 return *(int *)b-*(int *)a; 9 }10 11 int main()12 {13 int n,i,j,k,h,l,min;14 int a[10001];15 scanf("%d",&n);16 getchar();17 for(i = 0;i < n;i++)18 {19 scanf("%d",&a[i]); 20 }21 qsort(a,n,sizeof(a[0]),cmp);22 h = sqrt(n);//323 min = n;24 for(i = 1;i <= sqrt(n);i++)25 {26 if(n%i == 0)27 h = i;28 }//找到满足条件 差最小的数 29 l = n/h;//430 int b[l][h]; // 4 331 // printf("%d %d",l,h);32 memset(b,0,sizeof(b));33 i = 0,j = 0,k = 0;34 b[0][0] = a[k++];//先对第一个数赋值,不然后面不好计算 35 while(k < n)36 {37 while(j < h-1 && b[i][j+1] == 0)38 b[i][++j] = a[k++];//j = 2,i = 039 while(i < l-1 && b[i+1][j] == 0)40 b[++i][j] = a[k++];//i = 3,j = 241 while(j > 0 && b[i][j-1] == 0)42 b[i][--j] = a[k++];//i = 3,j = 0 43 while(i > 0 && b[i-1][j] == 0)44 b[--i][j] = a[k++];45 }46 for(i = 0;i < l;i++)47 {48 for(j = 0;j < h;j++)49 {50 if(j != 0)51 printf(" ");52 printf("%d",b[i][j]); 53 }54 printf("\n");55 }56 57 return 0; 58 }
1050. 螺旋矩阵(25)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。