PAT乙级1050 螺旋矩阵

该篇博客详细介绍了如何将一个序列以螺旋方式填充到矩阵中,通过设置四个方向并判断边界及已填充状态来改变填充顺序。博主首先对序列进行非递增排序,然后确定矩阵的行数和列数,最后使用二维数组存储螺旋填充的结果,并输出展示。博客内容涉及到排序、边界判断和矩阵操作等编程技巧。
#include <cstdio>
#include <algorithm>
#include <cstring>
/*
怎么把一个序列螺旋填进一个矩阵:
设置一个方向变量,有:上、下、左、右,四个方向,初始位置填左上角,然后下一个位置由上一个位置加上方向决定,
还要判断,如果下一个位置越界了或者已经被填过了,则按照:右转下,下转左,左转上,上转右的方式改变方向(顺时针)
填进一个矩阵后输出 
*/
using namespace std;

bool cmp(int a, int b){
	return a > b;
}

int main(){
	int n;
	scanf("%d", &n);
	int num[n];
	for(int i = 0; i < n; i++) scanf("%d", num + i);
	sort(num, num + n, cmp);	//按非递增排序 
	int row, temp = n, column;
	for(int i = 1; i <= n; i++){	//遍历寻找row-column最大的row
		if(n % i == 0 && i - n / i >= 0 && i - n / i < temp) row = i, temp = i - n / i;
	}
	column = n / row;	//知道了行数也就知道了列数
	int out[row][column];	//把数据顺螺旋依次填入这个二维数组,然后输出
	memset(out, 0, sizeof(out));
	int direction = 0, right = 0, down = 1, left = 2, up = 3;	//表示这个数据相对于上一个数据填入的方向
	int i = 0, j = 0; 	//填入数据的坐标
	out[i][j] = num[0];
	for(int k = 1; k < n; k++){
		if(direction == right){
			if(j + 1 < column && out[i][j + 1] == 0) j++;
			else i++, direction = down;
		}else if(direction == down){
			if(i + 1 < row && out[i + 1][j] == 0) i++;
			else j--, direction = left; 
		}else if(direction == left){
			if(j > 0 && out[i][j - 1] == 0) j--;
			else i--, direction = up;
		}else{
			if(i > 0 && out[i - 1][j] == 0) i--;
			else j++, direction = right;
		}
		out[i][j] = num[k];
	} 
	 
	for(int i = 0; i < row; i++){
		for(int j = 0; j < column ; j++){
			printf("%d", out[i][j]);
			if(j < column - 1) printf(" ");
		}
		if(i < row - 1) printf("\n");
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值