PTA 螺旋矩阵

本文提供了一个C++程序,用于将给定的正整数序列填充到螺旋矩阵中,展示了从输入到输出的完整过程。

作者 黄正鹏

单位 贵州工程应用技术学院

给定一个包含 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;
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值