题目链接:1050 螺旋矩阵 (25 point(s))

题目描述

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。

输入格式

输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 10​4​​,相邻数字以空格分隔。

输出格式

输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。

测试样例

Case 0:

  1. 12
  2. 37 76 20 98 76 42 53 95 60 81 58 93
  1. 98 95 93
  2. 42 37 81
  3. 53 20 76
  4. 58 60 76

Case 1:

  1. 5
  2. 3 2 4 1 5
  1. 5
  2. 4
  3. 3
  4. 2
  5. 1

Java代码

  1. /**********************************************************************************
  2. Submit Time Status Score Problem Compiler Run Time User
  3. 8/25/2019, 21:41:14 PA 24 1050 Java (openjdk) 177 ms wowpH
  4. Case 7: TLE
  5. **********************************************************************************/
  6. import java.io.BufferedReader;
  7. import java.io.InputStreamReader;
  8. import java.util.Arrays;
  9. public class Main {
  10. public static void main(String[] args) throws Exception {
  11. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  12. int N = Integer.parseInt(br.readLine());
  13. String[] arr = br.readLine().split(" ");
  14. int[] num = new int[N];
  15. for (int i = 0; i < N; ++i) {
  16. num[i] = Integer.parseInt(arr[i]);
  17. }
  18. Arrays.sort(num); // 所有数字升序排序
  19. int n = (int) Math.sqrt(N); // 开方得到 n 的可能最大值
  20. while (0 != N % n) { // 余数不为0,则 m 不是整数,不合要求
  21. --n; // n 自减
  22. }
  23. int m = N / n; // m × n = N
  24. int[][] matrix = new int[m][n]; // m × n 的矩阵
  25. int direction = 0; // 方向,0代表向右,1代表向下,2代表向左,3代表向上
  26. int k1 = 0, k2 = 0; // 矩阵下标
  27. for (int i = N - 1; i >= 0; --i) { // 所有数
  28. matrix[k1][k2] = num[i]; // 赋值给矩阵
  29. switch (direction) { // 方向
  30. case 0: // 向右
  31. if (k2 + 1 < n && 0 == matrix[k1][k2 + 1]) {// 右边未越界且未赋值
  32. ++k2; // 向右移动
  33. } else { // 右边越界或已经赋值
  34. ++k1; // 向下移动
  35. direction = 1; // 改变方向为向下
  36. }
  37. break;
  38. case 1: // 向下
  39. if (k1 + 1 < m && 0 == matrix[k1 + 1][k2]) {// 下边未越界且未赋值
  40. ++k1; // 向下移动
  41. } else { // 下边越界或已经赋值
  42. --k2; // 向左移动
  43. direction = 2; // 改变方向为向左
  44. }
  45. break;
  46. case 2: // 向左
  47. if (k2 - 1 >= 0 && 0 == matrix[k1][k2 - 1]) {// 左边未越界且未赋值
  48. --k2; // 向左移动
  49. } else { // 左边越界或已经赋值
  50. --k1; // 向上移动
  51. direction = 3; // 改变方向为向上
  52. }
  53. break;
  54. default: // 向上
  55. if (k1 - 1 >= 0 && 0 == matrix[k1 - 1][k2]) {// 上边未越界且未赋值
  56. --k1; // 向上移动
  57. } else { // 上边越界或已经赋值
  58. ++k2; // 向右移动
  59. direction = 0; // 改变方向为向右
  60. }
  61. }
  62. }
  63. for (int i = 0; i < m; ++i) {
  64. for (int j = 0; j < n - 1; ++j) {
  65. System.out.print(matrix[i][j] + " "); // 输出矩阵
  66. }
  67. System.out.println(matrix[i][n - 1]);
  68. }
  69. }
  70. }

提交结果

PAT(B) 1050 螺旋矩阵(Java:24分)的更多相关文章

  1. PAT Basic 1050 螺旋矩阵 (25 分)

    本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N:m ...

  2. 【PAT】B1050 螺旋矩阵(25 分)

    实在不觉得递归等方式有什么简单的地方,没错我就是用的最笨的方法模拟. 和我一样的小白看代码应该很容易理解. #include<stdio.h> #include<math.h> ...

  3. pat乙级1050螺旋矩阵

    1.用vector建立二维数组: vector<vector<int>> arr(rows); ; i < rows; i++) arr[i].resize(cols); ...

  4. PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) 目录 PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) ...

  5. PAT 1050 螺旋矩阵(25)(代码)

    1050 螺旋矩阵(25)(25 分) 本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方 ...

  6. PAT-乙级-1050. 螺旋矩阵(25)

    1050. 螺旋矩阵(25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求将给定的N个正整数按非递增的 ...

  7. PAT——1050. 螺旋矩阵

    本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条件:m*n等于N:m>=n:且m- ...

  8. 1050 螺旋矩阵 (25 分)C语言

    本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 ...

  9. PAT 1050. 螺旋矩阵(25)

    本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条 ...

随机推荐

  1. 自用 goodsdetail

    JSON.parse(data.parameter)  存的字符串 <select id="getGoodsBaseInfoById" resultType="co ...

  2. 使用vault pki engine 方便的管理证书

    vault 是一个很方便的secret .敏感数据管理工具,当前的版本已经包含了UI,使用起来很方便 以下演示一个简单的pki 管理 项目使用docker-compose 运行,为了简单使用单机开发模 ...

  3. 干货 | 10分钟带你掌握branch and price(分支定价)算法超详细原理解析

    00 前言 相信大家对branch and price的神秘之处也非常好奇了.今天我们一起来揭秘该算法原理过程.不过,在此之前,请大家确保自己的branch and bound和column gene ...

  4. HTML试题解析

    1.关于CSS为什么会出现Bug说法不正确的是(). (选择二项) A:编写CSS样式时需要考虑在不同浏览器中实现表现一致 B:各大主流浏览器由于不同厂家开发,浏览器使用的内核不同,支持CSS的程度不 ...

  5. vue 进入页面与离开页面触发事件

    1.切换进入当前路由之前的钩子函数 beforeRouteEnter <script> export default { beforeRouteEnter(to, form, next) ...

  6. rust字符串的slice

    fn main() { let s = String::from("hello dj"); //字符串字面值实际就是字符串的切片,所以 let ss ="hello dj ...

  7. Java自己实现HTTP服务器来理解GET和POST区别

    GET请求和POST请求有什么区别?GET请求的参数在URL的问号后面显示,而POST参数不在URL上:POST可以比GET请求更大的数据…一般的回答都是这样.   但是作为一个高端大气上档次的程序员 ...

  8. maven依赖 dependency中scope=compile 和 provided区别

    问题再现 上次这边朋友问我一个问题,就是他们在pom.xml中的dependency中,看到有一些是provided的情况,比如如下: <dependency> <groupId&g ...

  9. Deep High-Resolution Representation Learning for Human Pose Estimation

    Deep High-Resolution Representation Learning for Human Pose Estimation 2019-08-30 22:05:59 Paper: CV ...

  10. 004 vue组件

    一:创建组件 1.第一种创建方式 主要有Vue.extend,Vue.component. 注释掉的代码是一步一步的推断,后面的代码是简化的代码. <!DOCTYPE html> < ...