PTA甲级 1105 Spiral Matrix (25point(s))

强烈推荐,刷PTA的朋友都认识一下柳神–PTA解法大佬

本文由参考于柳神博客写成

柳神的CSDN博客,这个可以搜索文章

柳神的个人博客,这个没有广告,但是不能搜索

还有就是非常非常有用的 算法笔记 全名是

算法笔记  上级训练实战指南		//这本都是PTA的题解
算法笔记

PS 今天也要加油鸭

在这里插入图片描述

题目原文

This time your job is to fill a sequence of N positive integers into a spiral matrix in non-increasing order. A spiral matrix is filled in from the first element at the upper-left corner, then move in a clockwise spiral. The matrix has m rows and n columns, where m and n satisfy the following: m×n must be equal to N; mn; and mn is the minimum of all the possible values.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N. Then the next line contains N positive integers to be filled into the spiral matrix. All the numbers are no more than 104. The numbers in a line are separated by spaces.

Output Specification:

For each test case, output the resulting matrix in m lines, each contains n numbers. There must be exactly 1 space between two adjacent numbers, and no extra space at the end of each line.

Sample Input:

12
37 76 20 98 76 42 53 95 60 81 58 93

Sample Output:

98 95 93
42 37 81
53 20 76
58 60 76

题目大意:

给你N个正整数按非递增的顺序,填入"螺旋矩阵".

思路如下:

设置上,下,左右.边界来写.设置一下数组来做.

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const int maxn = 10010;
//matrix为欲输出的矩阵,A为给定的序列
int matrix[maxn][maxn], A[maxn];
bool cmp(int a, int b) {
	return a > b;
}
int main() {
	int N;
	scanf("%d", &N);			//序列元素个数
	for (int i = 0; i < N; ++i) {
		scanf("%d", &A[i]);		//序列元素
	}
	if (N == 1) {				//只有一个数时直接特例输出
		printf("%d", A[0]);		
		return 0;
	}
	sort(A, A + N, cmp);				//将序列从大到小排序
	int m = (int)ceil(sqrt(1.0 * N));	//行数m初始为根号N
	while (N % m != 0) {
		m++;							//寻找最小的能整除N的m
	}
	//n为列数,i,j为当前欲填的位置,now指向序列中当前待填的数的下标
	int n = N / m, i = 1, j = 1, now = 0;
	int U = 1, D = m, L = 1, R = n;		//4个边界
	while (now < N) {					//只要已经填充的数的个数没有达到N
		while (now < N && j < R) {		//向右填充
			matrix[i][j] = A[now++];
			j++;
		}
		while (now < N && i < D) {		//向下填充
			matrix[i][j] = A[now++];
			i++;
		}
		while (now<N && j>L) {
			matrix[i][j] = A[now++];
			j--;
		}
		while (now<N && i>U) {
			matrix[i][j] = A[now++];
			i--;
		}
		U++, D--, L++, R--;		//缩小边界
		i++, j++;
		if (now == N - 1) {
			matrix[i][j] = A[now++];
		}
	}
	for (int i = 1; i <= m; i++) {	//输出矩阵
		for (int j = 1; j <= n; j++) {
			printf("%d", matrix[i][j]);
			if (j < n)	printf(" ");
			else printf("\n");
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值