本题要求将给定的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
去年只学了c语言,思维也比较差,时间卡在边上,现在重新想了想,哇,挺简单的啊。
首先要确定矩阵的长宽,然后一层一层的进行镶嵌
#include <iostream> #include <algorithm> using namespace std; bool cmp(int a,int b) { return a>b; } int se[10000][10000]; int main() { int n,ar[10000]; int res1=0,res2=0,k=0;//必须初始化从0开始 int a=1,b=1,x,y; cin>>n; while(a*b!=n) { a++; if(a*b>n)b--; else if(a*b<n)b++; }//a,b已经确定 x=a,y=b;//a,b会改变 先记录a,b的值方便最后输出 #if(0) cout<<x<<' '<<y<<endl; #endif for(int i=0;i<n;i++) cin>>ar[i]; sort(ar,ar+n,cmp); while(a>res1&&b>res2) { for(int i=res2;i<b;i++) se[res1][i]=ar[k++]; if(k==n)break; for(int i=res1+1;i<a;i++) se[i][b-1]=ar[k++]; if(k==n)break; for(int i=b-2;i>=res2;i--) se[a-1][i]=ar[k++]; if(k==n)break; for(int i=a-2;i>res1;i--) se[i][res2]=ar[k++]; if(k==n)break; //进行下一圈 a-=1,b-=1; res1+=1,res2+=1; } for(int i=0;i<x;i++) for(int j=0;j<y;j++) if(j==y-1)cout<<se[i][j]<<endl; else cout<<se[i][j]<<' '; }