PAT——1050. 螺旋矩阵

本题要求将给定的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
没有全对,有一个测试点错误,有两个测试点超时。
 1 package com.hone.basical;
 2 import java.util.Arrays;
 3 import java.util.Scanner;
 4 /**
 5  * 原题目:https://www.patest.cn/contests/pat-b-practise/1049
 6  * @author Xia
 7  * 模拟旋转的方向,四个方向,先将一个个元素都装入到二维数组中
 8  * 部分节点超时
 9  */
10 public class basicalLevel1049ArraySum {
11 
12     public static void main(String[] args) {
13 
14         Scanner in = new Scanner(System.in);
15         int n = in.nextInt();
16         int[] a = new int[n];
17         for (int i = 0; i < a.length; i++) {
18             a[i] = in.nextInt();
19         }
20         //求出矩阵的m,n(使得对应的m-n最小)
21         int m = n;
22         int n2 = 1;
23         for (int i = (int) Math.sqrt(n)+1; i < a.length; i++) {
24             for (int j = (int) Math.sqrt(n); j > 0 ; j--) {
25                 if (i*j==n) {
26                     if ((i-j)<(m-n2)) {
27                         m = i;
28                         n2 = j;
29                     }
30                     break;
31                 }
32             }
33         }
34         //先将数组排序
35         Arrays.sort(a);
36         
37         int[][] matrix = new int[m][n2];                //用一个二维数组来装填所有的数组
38         int i=0,j=0;                                    //i表示行,j表示列
39         int index = n-1;
40         while (index>=0) {
41             //往右移动
42             for (; index>=0&&j<n2&&matrix[i][j]==0; j++) {
43                 matrix[i][j]=a[index--];
44             }
45             i++;
46             j--;        //考虑清楚这里面j--的原因?(因为在跳出循环之后j仍然做了一次加法)
47             //往下移动
48             for (; index>=0&&i<m&&matrix[i][j]==0; i++) {
49                 matrix[i][j]=a[index--];
50             }
51             i--;
52             j--;
53             //往左边移动
54             for (; index>=0&&j>=0&&matrix[i][j]==0; j--) {
55                 matrix[i][j]=a[index--];
56             }
57             i--;
58             j++;
59             //往上移动
60             for (; index>=0&&i>=0&&matrix[i][j]==0; i--) {
61                 matrix[i][j]=a[index--];
62             }
63             i++;
64             j++;
65         }
66         for (int p = 0; p < m; p++) {
67             System.out.print(matrix[p][0]);
68             for (int q = 1; q < n2; q++) {
69                 System.out.print(" " + matrix[p][q]);
70             }
71             System.out.println("");
72         }
73         
74      }
75 
76 }
原文地址:https://www.cnblogs.com/xiaxj/p/7998004.html