1050 螺旋矩阵 (25分) PAT (Basic Level) Practice 边界

边框
在二维数组外面增加一个边界
对于向右的数组,边界就是left_border——right_border
对于向下的数组,边界就是up_border——down_border
对于向左的数组,边界就是right_border——left_border
对于向上的数组,边界就是down_border——up_border


每向右移动,以up_border+1为行,列为left_border+1——right_border-1,遍历完后,将up_border++;
每向下移动,以right_border-1为列,行为up_border+1——down_border-1,遍历完后,将right_border–;
每向左移动,以down_border–为行,列为right_border+1——left_border-1,遍历完后,将down_border–;
每向上移动,以left_border+1为列,行为down_border-1——up_border-1,遍历完后,将left_border++;

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
int Martix[20000][1000];
int a[100000];
bool cmp(int a,int b) {return a>b;}
int main(int argc,char * argv[])
{
	int N,m,n,k=0,x=0;
	bool down,up,right,left;
	cin >> N;
	for(int i=0;i<N;i++)
		scanf("%d",&a[i]);
	sort(a,a+N,cmp);					
	m=int(sqrt(N*1.0));
	while(N%m)
		m++;
	n=N/m;
	if(m<n) swap(m,n);
	int right_border=n+1,left_border=0,up_border=0,down_border=m+1;
	right=true;
	while(x!=N)
	{
			up_border++;
			for(int j=left_border+1;j<right_border&&x!=N;j++)
				Martix[up_border][j]=a[x++];
			right_border--;
			for(int i=up_border+1;i<down_border&&x!=N;i++)
				Martix[i][right_border]=a[x++];
			down_border--;
			for(int j=right_border-1;j>left_border&&x!=N;j--)
				Martix[down_border][j]=a[x++];
			left_border++;
			for(int i=down_border-1;i>up_border&&x!=N;i--)
				Martix[i][left_border]=a[x++];				
	}
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
			{
			printf("%d",Martix[i][j]);
				if(j!=n) printf(" ");
			}
		printf("\n");
	}	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super__Bb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值