1050 螺旋矩阵

和力扣上一道题差不多,不过的当时没写出来,这次出来了。
注释写好了。

#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;
}
posted @ 2024-04-18 15:34  YuKiCheng  阅读(8)  评论(0编辑  收藏  举报