zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    android 拖放功能
    android 桌面文件夹ui美化
    instanceof 杂谈
    Android自定义长按事件
    launcher in android
    类似网易163TAB选项卡(标签)代码
    【新手入门教程】简洁纯CSS下拉导航菜单代码
    橘黄色的大气CSS菜单代码
    Flash效果的网站后台左侧Js多级展开菜单代码
    仿FLASH动感十足鼠标滑过放大的菜单代码
  • 原文地址:https://www.cnblogs.com/xiaxj/p/7998004.html
Copyright © 2011-2022 走看看