PAT 1105. Spiral Matrix (25) 螺旋矩阵,二维数组的一维应用及边界模拟

本文介绍了一道关于螺旋矩阵的编程题目,详细讲解了如何通过模拟算法构建一个螺旋填充的矩阵,特别关注矩阵行列数的选择及螺旋填充的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<string>
#include<cmath>

using namespace std;

//60min
//耗时于改bug
/*************************
题意:
给一个序列
求螺旋矩阵。。常见模拟题
矩阵的行列相差最小,相加为N
*************************/

/************************
求解要点:
1.求行列数时,用n开根号,找到离n最近的整数
接着再把最大的赋给m即可。

2.坐标=i*n+m
事先初始化ans数组为-1
按螺旋的规律进行赋值,要连续设置4个while循环
注意先自己在纸上计算好i,j的关系
再去写
不要先写再改,太费时间了。
************************/

/***********************
笔记:

*********************/


#define M 20000 

bool cmp(int a,int b)
{
	return a>b;
}
int num[M],ans[M];
int main()
{
	int n,i,m;
	int numn;
	scanf("%d",&n);
	numn=n;
	for(i=0;i<n;i++)
		scanf("%d",&num[i]);
	sort(num,num+n,cmp);
	
	for(i=0;i<=numn;i++)
		ans[i]=-1;
	int fm=int(sqrt(double(n)));
	for(i=fm;i<=n;i++)
	{
		if(n%i==0)
		{
			m=i;
			n=n/i;
			break;
		}
	}
	if(m<n)
		swap(m,n);
	//cout<<n<<" "<<m<<endl;

	int j=-1;
	i=0;
	int k=0;
	//cout<<num[0]<<endl;
	while(k<numn)
	{
		j++;
		while(k<numn)
		{
			//printf("1:ans[%d]=num[%d]=%d\n,\n",i*n+j,k,num[k]);
			ans[i*n+j]=num[k++];
			if(j+1==n || ans[i*n+j+1]!=-1)
				break;
			else j++;
		}

		i++;
		while(k<numn)
		{	
			//printf("2:ans[%d]=num[%d]=%d\n,\n",i*n+j,k,num[k]);
			ans[i*n+j]=num[k++];
			if(i+1==m || ans[(i+1)*n+j]!=-1)
				break;
			else i++;
		}
		
		j--;
		while(k<numn)
		{			
			//printf("3:ans[%d]=num[%d]=%d\n,\n",i*n+j,k,num[k]);
			ans[i*n+j]=num[k++];
			if(j-1<0 || ans[i*n+j-1]!=-1)
				break;
			else j--;
		}
		
		i--;
		while(k<numn)
		{			
			//printf("4:ans[%d]=num[%d]=%d\n,\n",i*n+j,k,num[k]);
			ans[i*n+j]=num[k++];
			if(i-1<0 || ans[(i-1)*n+j]!=-1)
				break;
			else i--;
		}

	}

	for(i=0;i<m;i++)
	{
		printf("%d",ans[i*n]);
		for(j=1;j<n;j++)
		{
			printf(" %d",ans[i*n+j]);
		}
		cout<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值