在 'circular' 数组中查找下一个位置

Finding next position in 'circular' array

我有一个由 8 个罗盘点组成的数组,从 SW 顺时针编号到 S:

2 3 4
1   5
0 7 6

我想计算从一点到另一点的最短路线是顺时针 (+1) 还是逆时针 (-1)。例如。从 7 到 5 是 -1,从 7 到 0 是 + 1。

我想是个简单的问题,但我今天真的脑子冻僵了。

我得到的最接近的是 if abs(start - end) < 4, -1, 1,但如果开始是 3,那将不起作用。

有一个类似的问题here,公认的答案是使用模数,但没有解释如何使用。我进行了各种计算,但都没有成功。

试试这个

int start=3;
int end=6;

var temp = start-end;
temp= temp < 0 ? temp + 7 : temp;

var result = temp < 4 ? -1 : 1;

不使用 abs,而是添加 8(条目数)然后取模 8,如下所示:

enum Direction {
     None, Clockwise, Counterclockwise
}

public static Direction GetDirection(int a, int b) {
    if (a == b) {
        return Direction.None;
    }
    return (a-b+8)%8 > 4 ? Direction.Clockwise : Direction.Counterclockwise;
}

加上8使得差值非负; modulo-8 将其带入 0...7 范围。

注意,当步数为4时,走哪条路都无所谓,所以程序更喜欢逆时针。您可以使用 >= 代替 >.

来更改它