查找螺旋填充矩阵的特定索引处的数字

CIK*_*emy 3 algorithm matrix

问题如下:

\n

我们有 3 个整数值作为输入: n, i, j\n假设我们有 n \xc3\x97 n 矩阵,其中以顺时针螺旋方式填充从 1 到 n\xc2\xb2 的数字。查找索引 (i, j) 处的数字。

\n

我知道如何构造这样的矩阵,我可以通过填充矩阵并查看索引(i,j)来解决它,并且我认为这样的解决方案有点过于“蛮力”。我相信数字 n、索引 i、j 和该单元格中的数字之间应该存在某种数学关系。我尝试过一些方法,但找不到方法。有什么建议可以帮助我的尝试吗?

\n

编辑:5x5 矩阵示例:

\n
1  2  3  4  5 \n16 17 18 19 6\n15 24 25 20 7\n14 23 22 21 8\n13 12 11 10 9\n
Run Code Online (Sandbox Code Playgroud)\n

mar*_*aca 5

您可以使用一些基本算术来完成此操作(假设基于 0 的索引,i代表行和j列):

  1. 找到该数字所在的环。它是r = min(i, j, n - i - 1, n - j - 1)。这是从外到内数环。如果我们从内到外数(稍后会派上用场),那么我们会得到q = (n - 1) / 2 - rfor oddnq = (n - 2) / 2 - rfor Even n。或广义:与整数除法q = (n - 2 + n % 2) / 2 - r相同(如@Stef提到的)。q = (n - 1) / 2 - r

  2. 不难看出,如果 n 为奇数,则从最内向外,环所覆盖的元素数量(包括环内的数字)为 1^2, 3^2, 5^2, ... 2^2, 4^2, 6^2, ... 如果 n 是偶数。所以被环覆盖的正方形的边长q是(广义形式)m = q * 2 + 2 - n % 2。这意味着环左上角的元素是b = n^2 - m^2 + 1

  3. 获取号码:

    1. 如果r == i:(b + j - r元素位于顶部)。

    2. 如果r == n - j - 1:(b + m - 1 + i - r元素位于右侧)

    3. 如果r == n - i - 1:(b + 2 * m - 2 + n - j - 1 - r元素位于底部)

    4. 否则 ( r == j): b + 3 * m - 3 + n - i - 1 - r(元素在左侧)

这是 O(1)。公式可以简化,但解释会更难理解。

示例:n = 5,i = 3,j = 2

  1. r = min(2, 3, 1, 2) = 1, q = (3 + 1) / 2 - 1 = 1
  2. m = 2 + 2 - 1 = 3,b = 25 - 9 + 1 = 17
  3. 第三个条件适用:17 + 6 - 2 + 5 - 2 - 1 - 1 = 22