本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。
输入格式:
输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 104,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。
输入样例:
12
37 76 20 98 76 42 53 95 60 81 58 93
输出样例:
98 95 93
42 37 81
53 20 76
58 60 76
题解如下:
24/25 case7错误
case3,5是对质数的处理,case1注意不要重复赋值
先求出行数和列数:先对数组长度num求平方根,如果得到的数是整数,那这个整数就是M,N的值,否则继续往后遍历,第一个能够被num整除的数即为M
在输出的时候注意数组长度为0后就跳出循环
/**
* 2024/04/01
* 24/25
*/
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let num = 2;
let rows = [];
let m, n;
rl.on("line", function (data) {
rows.push(data);
if (rows.length === 1) {
// 求m,n: m*n=data,m>=n,m-n最小
getMN(data);
}
if (rows.length === num) {
output(data.split(" "));
}
});
/**
* 求行数和列数
* @param data
*/
function getMN(data) {
// 如果data开根之后是整数,则m=n=num
let num = Math.sqrt(data);
if (num % 1 === 0) {
m = num;
n = num;
} else {
// 向上取整
num = Math.ceil(num);
// case3,5: 注意这里判断条件是<=,否则会忽略质数的情况
for (let i = num; i <= data; i++) {
if (data % i === 0) {
m = i;
n = data / i;
break;
}
}
}
}
/**
* case1: 注意数据长度不要超过
* @param arr
*/
function output(arr) {
// 将数组按降序排列
arr.sort((a, b) => b - a);
// 直接初始化一维数组会报错
// 也不能用fill,用fill填充的是同一个数组
let resArr = Array.from(Array(m), () => Array(n));
// m行n列
let k = 0;
while (arr.length) {
// 行不变,列++
for (let j = k; j <= n - 1 - k && arr.length; j++) {
resArr[k][j] = arr.shift();
}
// 列不变,行++
for (let i = k + 1; i < m - 1 - k && arr.length; i++) {
resArr[i][n - 1 - k] = arr.shift();
}
// 行不变,列--
for (let j = n - 1 - k; j > k && arr.length; j--) {
resArr[m - 1 - k][j] = arr.shift();
}
// 列不变,行--
for (let i = m - 1 - k; i > k && arr.length; i--) {
resArr[i][k] = arr.shift();
}
k++;
}
resArr.forEach((el) => {
console.log(el.join(" "));
});
}