如何在N×N网格中通过x、y坐标获取数组索引?
当然存在反向操作的方法!
这本质上就是把二维坐标重新映射回一维数组索引的问题,核心完全取决于你当初从索引转x、y时采用的存储规则——也就是数组是按行优先还是列优先排列的,另外还要注意坐标是从0开始计数(0-based)还是从1开始(1-based)。
我分两种最常见的情况给你拆解:
情况1:行优先存储(Row-Major Order)
这是C、Java等大多数编程语言默认的数组存储方式,简单说就是“先填满一行,再换下一行”。
- 假设你的数组有
M行、N列,当初从索引转x(行号)、y(列号)的公式是:# 0-based 坐标 x = index // N y = index % N - 那反向推导,从x、y求索引的公式就是:
# 0-based 坐标转索引 index = x * N + y - 如果你的坐标是1-based(比如Excel单元格那种从1开始计数),只需要先把x、y转成0-base再计算:
# 1-based 坐标转索引 index = (x - 1) * N + (y - 1)
情况2:列优先存储(Column-Major Order)
这种是Fortran、MATLAB这类语言的默认存储方式,逻辑是“先填满一列,再换下一列”。
- 同样假设数组有
M行、N列,当初从索引转x、y的公式是:# 0-based 坐标 x = index % M y = index // M - 反向的坐标转索引公式就是:
# 0-based 坐标转索引 index = y * M + x - 要是坐标是1-based,同样做个偏移调整:
# 1-based 坐标转索引 index = (y - 1) * M + (x - 1)
额外注意事项
- 不管哪种情况,你必须知道数组的总行数M和总列数N,这两个是反向计算的核心参数,不然没法准确映射。
- 如果你的正向转换不是标准的行/列优先,而是自定义的映射规则,那只需要把正向的数学公式逆推求解就行。比如你当初的正向规则是
x = (index + 2) % M,y = (index + 2) // M,那反向解出index = y*M + x -2就可以了。
内容的提问来源于stack exchange,提问作者code06
相关产品推荐
相关产品推荐

