2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++)
题目描述
疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法:
给出数字个数 n (0 < n ≤ 999)和行数 m(0 < m ≤ 999),从左上角的 1 开始,
按照顺时针螺旋向内写方式,依次写出2,3,....,n,最终形成一个 m 行矩阵。
小明对这个矩阵有些要求:
- 每行数字的个数一样多
- 列的数量尽可能少
- 填充数字时优先填充外部
- 数字不够时,使用单个 * 号占位
输入描述
两个整数,空格隔开,依次表示 n、m
输出描述
符合要求的唯一矩阵
用例1
输入
9 4
输出
1 2 3
* * 4
9 * 5
8 7 6
说明
9个数字写出4行,最少需要3列
考点
逻辑思维
解题思路
先计算出矩阵的列数,ceil(n/m)向上取整,然后将矩阵初始化为全*;然后根据规则,从左到右,从上到下,螺旋状从外到内的顺序,将从1开始递增的n个数字经过的坐标依次记录在数组中,未被填充到的坐标即为*;最后,按数组内记录的坐标,依次填充从1到n的n个数,即得到螺旋矩阵。
n,m=list(map(int, input().split())) col=int(n/m) #列数 re=n%m #余数 if re>0: col+=1 res=[] for i in range(m): tmp=[] for j in range(col): tmp.append('*') res.append(tmp) t=1 #当前遍历到的数;从1递增遍历,从外圈向内 r=0 #r,c当前行列号 c=0 cmin=0 #当前最小列号 rmin=0 #当前最小行号 cmax=col-1 #当前最大列号 rmax=m-1 #当前最大行号 idxs=[] #依次存每个数的坐标 while t<=n: if r==rmin and c<=cmax: print(t) idxs.append([r,c])