💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
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 ###代码 ~~~ #include<stdio.h> #include<stdlib.h> int *buf,**matrix,guide=0,m,n,N; struct position { int x; int y; } filler={0,0},direction[4]={{1,0},{0,1},{-1,0},{0,-1}}; int rcompare(const void *a,const void *b) { return *(int *)b-*(int *)a; } int canmove() { int x,y; x=filler.x+direction[guide].x; y=filler.y+direction[guide].y; if(x<0||x>=n||y<0||y>=m) { return 0; } else if(matrix[y][x]!=0) { return 0; } return 1; } int move(int count) { matrix[filler.y][filler.x]=buf[count]; if(count==N-1) { return 0; } while(!canmove()) { guide=(guide+1)%4; } filler.y+=direction[guide].y; filler.x+=direction[guide].x; return 0; } int main() { int i,j,count=0; scanf("%d",&N); buf=(int *)malloc(N*sizeof(int)); for(i=0;i<N;i++) { scanf("%d",buf+i); } qsort(buf,N,sizeof(int),rcompare); m=N; n=1; for(i=N;i>0;i--) { if(N%i==0) { if(i-N/i<0) { break; } if(i-N/i<m-n) { m=i; n=N/i; } } } matrix=(int **)malloc(m*sizeof(int *)); for(i=0;i<m;i++) { matrix[i]=(int *)calloc(n,sizeof(int)); } while(count<N) { move(count); count++; } for(i=0;i<m;i++) { for(j=0;j<n-1;j++) { printf("%d ",matrix[i][j]); } printf("%d\n",matrix[i][j]); } } ~~~