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
螺旋,即选用四个参数标定上下左右的极值,用ij遍历。
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int maxn=10001;
int b[maxn][maxn]; int a[maxn]; 因为太大了 不能放在主函数里 放在外面就对了 里面b[10001][10001]会因为太大,而出错。
bool cmp(int a,int b){
return a>b;
}
int main(){
int N;
scanf("%d",&N);
int k=sqrt(N);
for(int i=k;i>=1;i--){
if(N%i==0){k=i;break;}
}
int m,n;
n=k;
m=N/k;
for(int i=0;i<N;i++){
scanf("%d",&a[i]);
}
sort(a,a+N,cmp);
int t=0,i=0,j=0;
int you=n-1,xia=m-1,zuo=0,shang=0;
while(t<N){
while(i<=you){
b[j][i]=a[t];
// printf("%d %d %d\n",b[j][i],j,i);
t++;i++;
}
if(t==N){break;}
shang++;j++;i--;
while(j<=xia){
b[j][i]=a[t];
// printf("%d %d %d\n",b[j][i],j,i);
t++;j++;
}
if(t==N){break;}
you--;i--;j--;
while(i>=zuo){
b[j][i]=a[t];
// printf("%d %d %d\n",b[j][i],j,i);
t++;i--;
}
if(t==N){break;}
xia--;j--;i++;
while(j>=shang){
b[j][i]=a[t];
// printf("%d %d %d\n",b[j][i],j,i);
t++;j--;
}
if(t==N){break;}
zuo++;i++;j++;
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
printf("%d",b[i][j]);
if(j!=n-1){
printf(" ");
}else{
printf("\n");
}
}
}
return 0;
}