在限定范围内从一个数字到另一个数字的最短路径
Shortest way from a number to another in a clamped range
我有一个 float
,它夹在另外两个 floats
之间,形成了一个可能值的范围。在我的设置中,如果值超过范围的任一端点,它将流到另一侧。也就是说,如果该值被限制在 0 和 10 之间并且该值本身为 9,则向其添加 2 使其流向 0 (9 -> 10 -> 0
)
我需要计算范围内两个值之间最短的 "path",所以如果我想知道从 2 到 9 的最短路径,那就是 2 -> 1 -> 0 -> 10 -> 9
,这意味着我必须从中减去 4。
我一直在努力寻找解决方案,但我就是无法解决这个问题。
对于您的示例,计算溢出时从上限值到下限值需要 1。所以我用它作为常量。
float a,b, bound1, bound2; // input data
var path1 = b - a; // straight way
var absPath1 = Math.Abs(path1);
var range = bound2 - bound1;
var path2 = range - absPath1 + 1;
if(b > a) path2 = -path2;
var absPath2 = Math.Abs(path2);
var shortestPath = absPath1 > absPath2 ? path1 : path2;
我有一个 float
,它夹在另外两个 floats
之间,形成了一个可能值的范围。在我的设置中,如果值超过范围的任一端点,它将流到另一侧。也就是说,如果该值被限制在 0 和 10 之间并且该值本身为 9,则向其添加 2 使其流向 0 (9 -> 10 -> 0
)
我需要计算范围内两个值之间最短的 "path",所以如果我想知道从 2 到 9 的最短路径,那就是 2 -> 1 -> 0 -> 10 -> 9
,这意味着我必须从中减去 4。
我一直在努力寻找解决方案,但我就是无法解决这个问题。
对于您的示例,计算溢出时从上限值到下限值需要 1。所以我用它作为常量。
float a,b, bound1, bound2; // input data
var path1 = b - a; // straight way
var absPath1 = Math.Abs(path1);
var range = bound2 - bound1;
var path2 = range - absPath1 + 1;
if(b > a) path2 = -path2;
var absPath2 = Math.Abs(path2);
var shortestPath = absPath1 > absPath2 ? path1 : path2;