作者 黄正鹏
单位 贵州工程应用技术学院
给定一个包含 N 个正整数的序列,请你将序列中的元素以非递增顺序填充到螺旋矩阵中。
从左上角的第一个元素开始填充,并按照顺时针方向旋转。
要求矩阵有 m 行 n 列,并且 m,n 满足:
m×n=N,
m≥n,
m−n 尽可能小
输入格式:
第一行包含整数 N,1≤N≤10000。
第二行包含 N 个整数,1≤ 序列中元素 ≤10000。
输出格式:
输出填充好的 m×n 的矩阵。
数字之间用一个空格隔开,结尾不得有多余空格。
输入样例:
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
没什么可说的,上代码!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\n"
ll n;
ll v[100007],value[107][107];
bool vis[107][107];
ll dir[4][2]={0,1,1,0,0,-1,-1,0};//方向数组,依次右->下->左->上
void solve(){
cin >> n;
for(ll i = 0 ; i < n ; i++)cin >> v[i];
sort(v,v+n);//排序
ll x,y,tx,ty,f=0,c=n-1,a,b;
for(ll i = 1 ; i <= sqrt(n) ; i++){//取边界
x=n/i;
y=n/x;
if(x*y == n)a=y,b=x;
}
x=1,y=1,tx=1,ty=1;//初始化为1,1点
while(n--){//填满n个点
value[x][y]=v[c];//把数值存入点
c--;//取下一个值的位置
vis[x][y]=1;//标记此点
tx=x+dir[f][0];//寻找下一个点
ty=y+dir[f][1];
if(tx < 1 || tx > b || ty < 1 || ty > a || vis[tx][ty]){
f=(f+1)%4;//转向
tx=x+dir[f][0];//寻找下一个点
ty=y+dir[f][1];
}
x=tx;//读入下一个点
y=ty;
}
for(ll i = 1 ; i <= b ; i ++){
for(ll j = 1 ; j <= a ; j ++){
if(j > 1)cout << " ";
cout << value[i][j];
}
cout << endl;
}
return;
}
int main(){
ll t=1;//cin >> t;
while(t--)solve();
return 0;
}
本文提供了一个C++程序,用于将给定的正整数序列填充到螺旋矩阵中,展示了从输入到输出的完整过程。
1254





