和力扣上一道题差不多,不过的当时没写出来,这次出来了。
注释写好了。
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
#define ll long long
int arr[100010];
int a[10010][10010];
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
int main() {
int n;
cin>>n;
for(int i=0; i<n; i++) cin>>arr[i];
sort(arr,arr+n,greater<int>());
int dist = inf;
int r,c;
//枚举行
for(int i=1; i<=n; i++) {
for(int j=1; j<=i; j++) { //枚举列
if(i*j==n && i-j<dist) {
dist=i-j;
r=i;
c=j;
}
}
}
//填充
int x=0,y=0;//初始坐标
int count = 0;//已经填充的数量
int dir = 0;//方向
while(count<n) {
a[x][y]=arr[count];//填充
count++;
int nextx=x+dx[dir];//新坐标
int nexty=y+dy[dir];
if(nextx<0||nextx>=r||nexty<0||nexty>=c||a[nextx][nexty]) {//当越界或者已经填充的时候需要改变方向
dir++;//改变方向
if(dir==4) {
dir=0;
}
nextx=x+dx[dir];//修正
nexty=y+dy[dir];
}
x=nextx;//重新赋值
y=nexty;
}
//cout << r << " " << c;
for(int i=0; i<r; i++) {
int flag = 0;
for(int j=0; j<c; j++) {
if(flag) cout << " ";
cout << a[i][j];
flag++;
}
cout << '\n';
}
return 0;
}
标签:1050,arr,螺旋,int,矩阵,inf,nextx,nexty,dir
From: https://www.cnblogs.com/chengyiyuki/p/18143629