1050 螺旋矩阵 (25 分)
本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。
输入格式:
输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 10
4
,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行 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
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
/**
* @author hang
* @create 2022/2/7 14:08
*/
public class Test1050 {
static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer tokenizer = new StringTokenizer("");
public static void main(String[] args) throws IOException {
int nn = nextInt();
int[] arr = new int[nn];
for (int i = 0; i < nn; i ++) {
arr[i] = nextInt();
}
Arrays.sort(arr);
int m = 0, n = 0;
for (n = (int) Math.sqrt(nn); n >= 1; n --) {
if (nn % n == 0) {
m = nn / n;
break;
}
}
int[][] arr2 = new int[m][n];
int j = 0, k = -1;
for (int i = nn - 1; i >= 0; ) {
for (k += 1;k < n; ) {
if (arr2[j][k] != 0) {
break;
}
arr2[j][k ++] = arr[i --];
}
k --;
for (j += 1;j < m; ) {
if (arr2[j][k] != 0) {
break;
}
arr2[j ++][k] = arr[i --];
}
j --;
for (k -= 1;k >= 0 ; ) {
if (arr2[j][k] != 0) {
break;
}
arr2[j][k --] = arr[i --];
}
k ++;
for (j -= 1;j >= 0; ) {
if (arr2[j][k] != 0) {
break;
}
arr2[j -- ][k] = arr[i --];
}
j ++;
}
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
StringBuilder s = new StringBuilder(arr2[0][0]);
s.append(arr2[0][0]);
for (j = 1; j < n; j ++) {
s.append(" " + arr2[0][j]);
}
pw.print(s);
pw.flush();
for (int i = 1; i < m; i ++) {
pw.println();
pw.flush();
StringBuilder ss = new StringBuilder();
ss.append(arr2[i][0]);
for (j = 1; j < n; j ++) {
ss.append(" " + arr2[i][j]);
}
pw.print(ss);
pw.flush();
}
}
static String next() throws IOException {
while (!tokenizer.hasMoreTokens()) {
tokenizer = new StringTokenizer(reader.readLine());
}
return tokenizer.nextToken();
}
static int nextInt() throws IOException {
return Integer.parseInt(next());
}
static double nextDoule() throws IOException {
return Double.parseDouble(next());
}
static long nextLong() throws IOException {
return Long.parseLong(next());
}
}
总结
先求出n,m的值
再将数组排序,依次放入数组中
用StringBuild 优化输出次数
最后一个点还是过不了