在 '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
时,走哪条路都无所谓,所以程序更喜欢逆时针。您可以使用 >=
代替 >
.
来更改它
我有一个由 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
时,走哪条路都无所谓,所以程序更喜欢逆时针。您可以使用 >=
代替 >
.