本题要求将给定的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 }