PTA 1050 螺旋矩阵 (25 分)

本文介绍了如何用螺旋方式遍历矩阵,通过想象小老鼠沿着矩阵边缘行走来理解算法。代码实现中包含了完整的思路。

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

1050 螺旋矩阵 (25 分)

想到一个比较好懂的方法欸
就是可以想象一只小老鼠在绕着矩阵的边边走路
思路全在代码里了!!!qwq
如有雷同……说明我们心意相通(谁要和你心意相通
因为很菜,写了好久好久

#include<bits/stdc++.h>
using namespace std;

//四个运动方向 
int di[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; 

int main()
{
	int N,m,n,x=0,y=0,d=0;//数的个数,行,列,初始坐标,初始方向 
	cin>>N;
	int arr[10005]; //存数用的数组,用来排序 
	
	for(int i=0;i<N;i++) cin>>arr[i];
	sort(arr,arr+N,greater<int>()); 
	
	//找到行数和列数 
	m=int(sqrt(N));
	for(int i=m;i<=N;i++)//之前这里忘记加等号,导致三个测试点过不去
	{
		if(N%i==0)
		{
			n=N/i;
			m=i;
			break; 
		}
	}
	if(n>m) swap(n,m);//这里是为了避免类似m=3,n=4的情况(m被向下取整了,然后n正好=m+1)
	
	//初始化矩阵 
	int mtrx[m][n];
	for(int i=0;i<m;i++) for(int j=0;j<n;j++) mtrx[i][j]=0;


	//ovo让我们沿着矩阵的边边前进:遇到非空的位置,或者走出界,就返回到上一步,并调整运动方向(→-- ↓-- ←-- ↑);一次填入一个,执行N次。
	for(int i=0;i<N;i++)
	{
		if(x>=0&&x<m&&y>=0&&y<n&&!mtrx[x][y]) 
		{
			mtrx[x][y]=arr[i];//填入
			x+=di[d][0],y+=di[d][1];//探路
		}
		else 
		{
			x-=di[d][0],y-=di[d][1];//退回去
			d=(d+1)%4;//改方向
			x+=di[d][0],y+=di[d][1];//再前进
			mtrx[x][y]=arr[i];//填入
			x+=di[d][0],y+=di[d][1];//探路
		}
	}
	
	//输出 
	bool zero;
	for(int i=0;i<m;i++)
	{
		zero=false;
		for(int j=0;j<n;j++) 
		{
			if(zero) cout<<" ";
			cout<<mtrx[i][j];
			zero=true;
		}
		cout<<endl;
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值