问题如下:
\n我们有 3 个整数值作为输入: n, i, j\n假设我们有 n \xc3\x97 n 矩阵,其中以顺时针螺旋方式填充从 1 到 n\xc2\xb2 的数字。查找索引 (i, j) 处的数字。
\n我知道如何构造这样的矩阵,我可以通过填充矩阵并查看索引(i,j)来解决它,并且我认为这样的解决方案有点过于“蛮力”。我相信数字 n、索引 i、j 和该单元格中的数字之间应该存在某种数学关系。我尝试过一些方法,但找不到方法。有什么建议可以帮助我的尝试吗?
\n编辑:5x5 矩阵示例:
\n1 2 3 4 5 \n16 17 18 19 6\n15 24 25 20 7\n14 23 22 21 8\n13 12 11 10 9\nRun Code Online (Sandbox Code Playgroud)\n
您可以使用一些基本算术来完成此操作(假设基于 0 的索引,i代表行和j列):
找到该数字所在的环。它是r = min(i, j, n - i - 1, n - j - 1)。这是从外到内数环。如果我们从内到外数(稍后会派上用场),那么我们会得到q = (n - 1) / 2 - rfor oddn或q = (n - 2) / 2 - rfor Even n。或广义:与整数除法q = (n - 2 + n % 2) / 2 - r相同(如@Stef提到的)。q = (n - 1) / 2 - r
不难看出,如果 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。
获取号码:
如果r == i:(b + j - r元素位于顶部)。
如果r == n - j - 1:(b + m - 1 + i - r元素位于右侧)
如果r == n - i - 1:(b + 2 * m - 2 + n - j - 1 - r元素位于底部)
否则 ( r == j): b + 3 * m - 3 + n - i - 1 - r(元素在左侧)
这是 O(1)。公式可以简化,但解释会更难理解。
示例:n = 5,i = 3,j = 2