本题要求将给定的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
//对n开平方后递减找出合适的长和宽,进行动态二维数组创建,并全部赋值为0
//使用sort进行排序,重定义cmp函数使其进行降序排序
//从(0,0)开始赋值,并向右移动,如果遇到边界或者下一个位置已经赋值(不为0),则调转方向,
//直到赋值达到n个则整个二维矩阵完全填满。
#include<algorithm>
#include<iostream>
#include<math.h>
bool cmp(int a,int b)
{
return a>b;
};
using namespace std;
int main()
{
int n;
cin>>n;
int tem=sqrt(n);
while(n%tem!=0)
{
tem--;
}
int x=tem,y=n/tem;
int **m;
m=new int*[x];
for(int q=0;q<x;q++)
{
m[q]=new int[y];
}
for(int t1=0;t1<x;t1++)
{
for(int t2=0;t2<y;t2++)
{
m[t1][t2]=0;
}
}
int* a=new int[n];
for(int p=0;p<n;p++)
{
cin>>a[p];
}
sort(a,a+n,cmp);
int flag=1;
int x1=0,y1=0;
for(int t=0;t<n;t++)
{
m[x1][y1]=a[t];
switch(flag)
{
case 1:
if(x1+1>=x || m[x1+1][y1]!=0)
{
y1++;
flag=2;
}
else
{
x1++;
}
break;
case 2:
if(y1+1>=y || m[x1][y1+1]!=0)
{
x1--;
flag=3;
}
else
{
y1++;
}
break;
case 3:
if(x1-1<0 || m[x1-1][y1]!=0)
{
y1--;
flag=4;
}
else
{
x1--;
}
break;
case 4:
if(y1-1<0 || m[x1][y1-1]!=0)
{
x1++;
flag=1;
}
else
{
y1--;
}
break;
default:
break;
}
}
for(int t1=0;t1<y;t1++)
{
cout<<m[0][t1];
for(int t2=1;t2<x;t2++)
{
cout<<" "<<m[t2][t1];
}
cout<<endl;
}
return 0;
}