1050 螺旋矩阵 (24/25 分)

13 篇文章 0 订阅

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 优化输出次数
最后一个点还是过不了
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海边的宇航员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值