强烈推荐,刷PTA的朋友都认识一下柳神–PTA解法大佬
本文由参考于柳神博客写成
还有就是非常非常有用的 算法笔记 全名是
算法笔记 上级训练实战指南 //这本都是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; m≥n; and m−n 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;
}