题目:1050 螺旋矩阵 - PAT (Basic Level) Practice (中文) (pintia.cn)
方向我们先从右边到下边再到左边,最后往上:
#include<bits/stdc++.h>
using namespace std;
int a[105][105];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int N=0;cin>>N;
vector<int>v(N,0);
for(int i=0;i<N;i++)cin>>v[i];
//求m,n
int m=0,n=0;
for(int i=1;i<=sqrt(N);i++) //枚举m
{
if(N%i==0)m=i,n=N/i;
if(m<=n)swap(m,n);
}
// cout<<m<<" "<<n<<endl;
sort(v.begin(),v.end(),cmp);
memset(a,0x3f,sizeof a); //做标记
//开始bfs
int x=0,y=0,d=0;
int index=0;
while(N--)
{
a[x][y]=v[index++];
int tempx=x+dx[d],tempy=y+dy[d];
if(tempx<0||tempx>=m||tempy<0||tempy>=n||a[tempx][tempy]!=0x3f3f3f3f)d=(d+1)%4;
x=x+dx[d],y=y+dy[d];
}
//输出
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cout<<a[i][j];
if(j+1!=n)cout<<" ";
}
cout<<endl;
}
return 0;
}
原因是可能m,n有一个可能是素数,那么就可能是1*某一个数,那么一个数是1,另一个数就是N,N最大是1e4,所以要开1e4