华为OD机试 - 螺旋数字矩阵(Java & JS & Python & C & C++)

03-24 1020阅读

题目描述

疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法:

给出数字个数 n (0

小明对这个矩阵有些要求:

  1. 每行数字的个数一样多
  2. 列的数量尽可能少
  3. 填充数字时优先填充外部
  4. 数字不够时,使用单个 * 号占位

输入描述

两个整数,空格隔开,依次表示 n、m

输出描述

符合要求的唯一矩阵

用例

输入9 4
输出1 2 3

* * 4

9 * 5

8 7 6

说明9个数字写出4行,最少需要3列
输入3 5
输出

1

2

3

*

*

说明3个数字写5行,只有一列,数字不够用*号填充
输入120 7
输出1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 19

45 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 63 20

44 83 114 115 116 117 118 119 120 * * * * * * 99 64 21

43 82 113 112 111 110 109 108 107 106 105 104 103 102 101 100 65 22

42 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 23

41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24

说明

题目解析

本题需要我们将1~n数字按照螺旋顺序填入矩阵。

本题只给出了矩阵的行数m,没有给列数,需要我们求解一个最少的列数来满足矩阵能够填入n个数字,因此列数 k = ceil(n / m),这里的除法不是整除,并且要对除法的结果向上取整。

将数字1~n按照螺旋顺序,从矩阵matrix左上角开始填入,比较考察思维能力,具体实现如下:

  • 定义变量step,初始step=1,表示当前要填入的数字,因此step ≤ n
  • 定义变量x,y,初始x=0, y=0,表示要填值得矩阵位置,即初始时从矩阵左上角开始填入

    然后按照顺序循环进行下面四个填值操作:

    1. 正序填入第X行
    2. 正序填入第Y列
    3. 倒序填入第X行
    4. 倒序填入第Y列

    华为OD机试 - 螺旋数字矩阵(Java & JS & Python & C & C++)

    具体行为如下:

    正序填入第x行

    初始时,X,Y处于下面位置

    华为OD机试 - 螺旋数字矩阵(Java & JS & Python & C & C++)

    按照螺旋顺序,我们应该正序填第X行,即此时行号X不变,列号Y++,具体操作是:

    matrix[x][y++] = step++

    当列号 Y >= k 时停止填值。如下图所示:此时 X = 0,Y = k

    华为OD机试 - 螺旋数字矩阵(Java & JS & Python & C & C++)

    正序填入第y列

    按照螺旋顺序,下一步我们应该做一次X++, Y--,让填值位置移动到(X,Y)位置

    华为OD机试 - 螺旋数字矩阵(Java & JS & Python & C & C++)

    开始正序填第Y列,即此时列号Y保持不变,行号X++,具体操作是:

    matrix[x++][y] = step++

    当行号X >= m 时停止填值。如下图所示:此时X=n,Y = k - 1

    华为OD机试 - 螺旋数字矩阵(Java & JS & Python & C & C++)

    倒序填入第x行

    按照螺旋顺序,下一步我们应该做一次X--, Y--,让填值位置移动到(X,Y)位置

    华为OD机试 - 螺旋数字矩阵(Java & JS & Python & C & C++)

    开始倒序填第X行,即此时行号X保持不变,列号Y--,具体操作是:

    matrix[x][y--] = step++

    当行号Y (await iter.next()).value; void (async function () { // n 表示需要在螺旋矩阵中填入 1 ~ n 数字 // m 是螺旋矩阵行数 const [n, m] = (await readline()).split(" ").map(Number); // k 是螺旋矩阵列数 const k = Math.ceil(n / m); // 螺旋矩阵,未填值位置默认值"*" const matrix = new Array(m).fill(0).map(() => new Array(k).fill("*")); // 当前要填入的值 let step = 1; // 当前要填入的值的位置 let x = 0; let y = 0; // 如果填入的值 > n,则停止填值,否则继续填 while (step

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]