PAT乙 1050. 螺旋矩阵(25)

xiaoxiao2021-02-28  30

1050. 螺旋矩阵(25)

题目地址:1050. 螺旋矩阵(25)

题目描述:

本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。

输入格式: 输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104,相邻数字以空格分隔。

输出格式: 输出螺旋矩阵。每行n个数字,共m行。相邻数字以1个空格分隔,行末不得有多余空格。


程序:

#include <iostream> #include <cmath> #include <algorithm> using namespace std; int cmp(int a, int b) { return a > b; } int ifBreak(int a, int n) { if (a == n) return 1; return 0; } int main() { int N, n, m; cin >> N; for (m = (int)sqrt(N); m >= 1; m--) if (N % m == 0) break; n = N / m; // 将数组非递增排序 int temp[N]; for (int k = 0; k < N; k++) cin >> temp[k]; sort(temp, temp + N, cmp); int Arr[n][m]; // 保存结果数组 int counter = 0; // 用于计数来中断while循环 int start = 0; // 设定起始值 int i, j; while (counter <= N) { for (j = start; j <= m - 1 - start; j++) { if (ifBreak(counter, N)) break; Arr[start][j] = temp[counter]; counter++; } j--; // 这里之所以这么写是因为j不自减的话就溢出了,下同 for (i = start + 1; i <= n - 1 - start; i++) { if (ifBreak(counter, N)) break; Arr[i][j] = temp[counter]; counter++; } i--; for (j = j - 1; j >= start; j--) { if (ifBreak(counter, N)) break; Arr[i][j] = temp[counter]; counter++; } j++; for (i = i - 1; i >= start + 1; i--) { if (ifBreak(counter, N)) break; Arr[i][j] = temp[counter]; counter++; } i++; if (counter == N) { break; } start++; } // 打印结果数组 int nn, mm; for (nn = 0; nn < n; nn++) { cout << Arr[nn][0]; for (mm = 1; mm < m; mm++) cout << " " << Arr[nn][mm]; cout << endl; } return 0; }
转载请注明原文地址: https://www.6miu.com/read-2631792.html

最新回复(0)