#include <cstdio>
#include <algorithm>
#include <cstring>
/*
怎么把一个序列螺旋填进一个矩阵:
设置一个方向变量,有:上、下、左、右,四个方向,初始位置填左上角,然后下一个位置由上一个位置加上方向决定,
还要判断,如果下一个位置越界了或者已经被填过了,则按照:右转下,下转左,左转上,上转右的方式改变方向(顺时针)
填进一个矩阵后输出
*/
using namespace std;
bool cmp(int a, int b){
return a > b;
}
int main(){
int n;
scanf("%d", &n);
int num[n];
for(int i = 0; i < n; i++) scanf("%d", num + i);
sort(num, num + n, cmp); //按非递增排序
int row, temp = n, column;
for(int i = 1; i <= n; i++){ //遍历寻找row-column最大的row
if(n % i == 0 && i - n / i >= 0 && i - n / i < temp) row = i, temp = i - n / i;
}
column = n / row; //知道了行数也就知道了列数
int out[row][column]; //把数据顺螺旋依次填入这个二维数组,然后输出
memset(out, 0, sizeof(out));
int direction = 0, right = 0, down = 1, left = 2, up = 3; //表示这个数据相对于上一个数据填入的方向
int i = 0, j = 0; //填入数据的坐标
out[i][j] = num[0];
for(int k = 1; k < n; k++){
if(direction == right){
if(j + 1 < column && out[i][j + 1] == 0) j++;
else i++, direction = down;
}else if(direction == down){
if(i + 1 < row && out[i + 1][j] == 0) i++;
else j--, direction = left;
}else if(direction == left){
if(j > 0 && out[i][j - 1] == 0) j--;
else i--, direction = up;
}else{
if(i > 0 && out[i - 1][j] == 0) i--;
else j++, direction = right;
}
out[i][j] = num[k];
}
for(int i = 0; i < row; i++){
for(int j = 0; j < column ; j++){
printf("%d", out[i][j]);
if(j < column - 1) printf(" ");
}
if(i < row - 1) printf("\n");
}
return 0;
}
PAT乙级1050 螺旋矩阵
最新推荐文章于 2026-06-20 18:32:07 发布
该篇博客详细介绍了如何将一个序列以螺旋方式填充到矩阵中,通过设置四个方向并判断边界及已填充状态来改变填充顺序。博主首先对序列进行非递增排序,然后确定矩阵的行数和列数,最后使用二维数组存储螺旋填充的结果,并输出展示。博客内容涉及到排序、边界判断和矩阵操作等编程技巧。

661

被折叠的 条评论
为什么被折叠?



