斜向矩阵编号下已知元素值定位所在行列的求解方法
斜向排布矩阵的坐标推导方法
排布规则说明
本类矩阵沿反对角线连续填充正整数,逐圈向外扩展,核心规则为:
- 行号r、列号c均从1开始计数,每个反对角线斜带满足固定值
s = r + c,同个斜带的元素数值连续排列 - 斜带s上共有s-1个元素,填充方向固定为从左边界点
(s-1, 1)出发,沿r递减、c递增的方向,一直延伸到上边界点(1, s-1) - 最小的斜带s=2仅包含元素1,对应坐标(1,1)
已知元素值x求对应(r,c)的计算步骤
- 定位元素所属的斜带s
- 斜带s之前累计的元素总数(即斜带s-1的最后一个元素值)为
prev_total = (s-1)*(s-2)/2 - 求解满足不等式
(s-1)*(s-2)/2 < x <= s*(s-1)/2的最小整数s,可通过公式直接计算:s = ceil( (1 + sqrt(8*x + 1)) / 2 )
- 斜带s之前累计的元素总数(即斜带s-1的最后一个元素值)为
- 计算元素在当前斜带内的偏移量d
- 从斜带起点开始的偏移位置为
d = x - prev_total,即当前元素是斜带s上的第d个元素
- 从斜带起点开始的偏移位置为
- 代入斜带坐标公式计算r、c
- 结合斜带的固定填充方向,可得:
r = s - d c = d
- 结合斜带的固定填充方向,可得:
验证示例
- x=6:计算得s=4,prev_total=3,d=3,r=4-3=1,c=3,对应(1,3)=6,与排布规则一致
- x=10:计算得s=5,prev_total=6,d=4,r=5-4=1,c=4,对应(1,4)=10,与排布规则一致
- x=12:计算得s=6,prev_total=10,d=2,r=6-2=4,c=2,对应(4,2)=12,与排布规则一致
注意:上述计算默认使用1起始的行列编号,若需转换为编程常用的0起始坐标,将得到的r、c分别减1即可。计算时需注意浮点数精度误差,开平方后建议做整数边界校验,避免因精度不足导致s值计算偏差。
内容的提问来源于stack exchange,提问作者Oleg Chaika
相关产品推荐
相关产品推荐

