给定一个网格,从中心开始螺旋向外,并给出一个位置,求其ID是多少?

4

网格:

+---------------+---------------+---------------+---------------+---------------+
| id:  20       | id:  19       | id:  18       | id:  17       | id:  16       |
| pos: (-2, -2) | pos: (-1, -2) | pos: (0, -2)  | pos: (1, -2)  | pos: (2, -2)  |
+---------------+---------------+---------------+---------------+---------------+
| id:  21       | id:  6        | id:  5        | id:  4        | id:  15       |
| pos: (-2, -1) | pos: (-1, -1) | pos: (0, -1)  | pos: (1, -1)  | pos: (2, -1)  |
+---------------+---------------+---------------+---------------+---------------+
| id:  22       | id:  7        | id:  0        | id:  3        | id:  14       |
| pos: (-2, 0)  | pos: (-1, 0)  | pos: (0, 0)   | pos: (1, 0)   | pos: (2, 0)   |
+---------------+---------------+---------------+---------------+---------------+
| id:  23       | id:  8        | id:  1        | id:  2        | id:  13       |
| pos: (-2, 1)  | pos: (-1, 1)  | pos: (0, 1)   | pos: (1, 1)   | pos: (2, 1)   |
+---------------+---------------+---------------+---------------+---------------+
| id:  24       | id:  9        | id:  10       | id:  11       | id:  12       |
| pos: (-2, 2)  | pos: (-1, 2)  | pos: (0, 2)   | pos: (1, 2)   | pos: (2, 2)   |
+---------------+---------------+---------------+---------------+---------------+

代码:

public static int IDFromPos(int sectionX, int sectionY) {
    int sectionId = 0;
    if (sectionX < 0 && Mathf.Abs (sectionX) >= Mathf.Abs (sectionY)) {
        sectionId = (int)Mathf.Pow (((-2 * sectionX) + 1), 2) - 1 - (-sectionX - sectionY);
    } else if (sectionX > 0 && Mathf.Abs (sectionX) >= Mathf.Abs (sectionY)) {
        sectionId = (int)Mathf.Pow (((2 * sectionX) + 1), 2) - 1 - (4 * sectionX) - (-sectionX - sectionY);
    } else if (sectionY < 0) {
        sectionId = (int)Mathf.Pow (((-2 * sectionY) + 1), 2) - 1 - (2 * sectionY) - (-sectionY + sectionX);
    } else {
        sectionId = (int)Mathf.Pow ((2 * (sectionY - 1) + 1), 2) + (sectionY - 1 + sectionX);
    }

    return sectionId;
}

测试

IDFromPos(-2, -2) = 20
IDFromPos(-2, -1) = 21
IDFromPos(-2, 0) = 22
IDFromPos(-2, 1) = 23
IDFromPos(-2, 2) = 24
IDFromPos(-1, -2) = 27 (should be 19)
IDFromPos(-1, -1) = 6
IDFromPos(-1, 0) = 7
IDFromPos(0, 0) = 0
IDFromPos(0, 1) = 1
IDFromPos(0, 2) = 10
IDFromPos(1, 0) = 5  (should be 3)
IDFromPos(1, 1) = 6  (should be 2)
IDFromPos(1, 2) = 11
IDFromPos(2, 0) = 18 (should be 14)
IDFromPos(2, 1) = 19 (should be 13)
IDFromPos(2, 2) = 20 (should be 12)

我已经盯着这个问题看了很长时间。但是我无法找出错误。给定坐标 (x,y)id 是什么?这个函数有什么问题吗?

网格位置不是正常的,请仔细查看。-,- 代表左上角,+,+ 代表右下角。


我不太明白你的问题是什么。 - SᴇM
@SeM - 我添加了几个更多的测试以及它们应该是什么。我只是试图获取给定 x,y 位置的 id - Justin808
请查看此帖子:https://dev59.com/a3RC5IYBdhLWcg3wJNgN - Rob
这是某种测试或面试问题吗? - SᴇM
@SeM - 不,这只是我正在玩耍的一个副业项目的一部分。我已经有一份自己喜欢的工作了。 - Justin808
显示剩余2条评论
2个回答

2
第二个和第三个else if中的计算是错误的。在第二个中,最后一个减法应该实际上是加法。在第三个中,中间的减法应该是加法。
// ...
} else if(sectionX > 0 && Mathf.Abs(sectionX) >= Mathf.Abs(sectionY)) {
    sectionId = (int)Mathf.Pow(((2 * sectionX) + 1), 2) - 1 - (4 * sectionX) + (-sectionX - sectionY);
} else if(sectionY < 0) {
    sectionId = (int)Mathf.Pow(((-2 * sectionY) + 1), 2) - 1 + (2 * sectionY) - (-sectionY + sectionX);
}
// ...

这将解决你所有的测试问题。

0

通过对角线将整个平面分成四个部分,并为每个部分形成结果:

x * x >= y * y, x >= 0:
   id = 4 * x * x - x - y
x * x >= y * y, x < 0:
   id = 4 * x * x - 3 * x + y
y * y < x * x, y >= 0:
   id = 4 * y * y - 3 * y + x
y * y < x * x, y < 0:
   id = 4 * y * y - y - x

id(2,1) = 16 - 2 - 1 = 12
id(2,-1) = 16 - 2 + 1 = 15
id(-2,1) = 16 + 6 + 1= 23
id(-1, -2) = 16 + 2 + 1= 19
id(-1, 2) = 16  - 6 - 1= 9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接