PAT乙级1050

本文介绍了一种算法,用于按照非递增顺序打印螺旋矩阵。首先计算矩阵的行和列数,然后按照特定颜色顺序(红黄蓝白)对矩阵进行赋值。最后,通过外层循环实现螺旋打印,特别处理了奇数列的情况。

题目链接

题目大意

按照非递增顺序打印螺旋矩阵

偶数列
在这里插入图片描述
奇数列
在这里插入图片描述

思路

1、本题中M表示列数,N表示列数,而列数小于等于行数,故可以通过列数计算出最多可以打印几圈。
用做外层循环。
2、按照红色、黄色、蓝色、白色的顺序依次对二维矩阵进行赋值

实现

#include <iostream>
#include <algorithm>
#define MAXSIZE 10001
using namespace std;

int getM(int N)	//用来得到一个数的某个因子,满足题目的条件
{
	int i, max = N;
	for (i = N; i > 0; i--)
	{
		if (N%i == 0 && i >= N / i && (i - N / i) < max)
			max = i;
	}
	return max;
}
bool cmp(int a, int b)
{
	return a > b;
}
int main()
{

	int num;	//元素个数
	int M, N;//行、列
	cin >> num;
	M = getM(num);	//得到行
	N = num / M;	//列
	int i, nums[MAXSIZE];
	for (i = 0; i < num; i++)
	{
		cin >> nums[i];
		//nums[i] = i+1;
	}
	sort(nums, nums + num, cmp);
	//动态创建二维数组
	int **matrix = new int*[M];
	for (int i = 0; i < M; i++)
		matrix[i] = new int[N];
	int m = M, n = N;
	int row = 0, col = 0;	//通过它们为matrix赋值
	i = 0;
	//画几个圆圈
	for (int count = 0; count < N / 2; count++)
	{
		for (; col < n - 1; col++)	//红色部分
		{
			matrix[row][col] = nums[i++];
		}
		for (; row < m - 1; row++)	//黄色
		{
			matrix[row][col] = nums[i++];
		}
		for (col = n - 1; col > count; col--)	//蓝色
		{
			matrix[row][col] = nums[i++];
		}
		for (row = m - 1; row > count; row--)	//白色
		{
			matrix[row][col] = nums[i++];
		}
		n--;
		m--;
		row++; 
		i--;	//打印完一圈会多加1
	}
	if (N % 2)	//奇数列特殊处理
	{
		if (N > 1)	//如果列数为1的话,不需要这一步,因为没有经过上面的for循环,i,row,col都是从0开始
		{
			col += 1; i++;
		}
			
		while (i < num)
		{
			matrix[row][col] = nums[i++];
			row++;
		}
	}
	for (i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (j == N - 1)
				printf("%d", matrix[i][j]);
			else
				printf("%d ", matrix[i][j]);

		}
		printf("\n");
	}
	return 0;
}










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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值