寻找一种用数学运动列表的算法

时间:2014-08-28 17:29:38

标签: algorithm math

我有一个数字列表。我没有将它们全部绘制成一行,而是按5行绘制列表。

现在我可以选择一个号码,然后向左,向右,向上或向下移动。

enter image description here

在这15个数字的列表中(索引为0到14)我选择了索引11,红色。

如果我向左移动,我必须从我选择的索引中减去1。如果我向右移动,我添加1.向下意味着我添加5和向上意味着我减去5。

然而,如果我在最底行的时候走下坡路,我想在第一行结束,如下:

enter image description here

数学/算法很简单:

index += 5;
if (index > list.size() ) index = index % 5;   // % is modulo

//So, since I start with index 11: (11 + 5) % 5 = 1, which is the index of 01.

但是,当我从排在最前面的行开始时,我似乎无法弄清楚要做什么,这会把我带到最底层的行。 (从01开始,我将在11日结束)

如果我有15个项目的清单,那么我可以这样做:

index -= 5;
if (index < 0) index += index.size(); 

//So:  1 - 5 = -4
//    -4 + 15 = 11.

但如果我的列表不能被5整除,那么这不起作用。

所以我正在寻找一种能在所有情况下解决这个问题的算法,包括当列表的大小不能被行的长度分割时。

1 个答案:

答案 0 :(得分:2)

这可能会进一步优化,但这是一种方法:

var fullRows = list.Length / NUM_COLUMNS; //using integer division
var maxPos = fullRows * NUM_COLUMNS + currentIndex;
return maxPos < list.Length ? maxPos : maxPos - NUM_COLUMNS;

这样做是通过假设 之后的另一行来获取完整行的数量然后开始。然后它会检查该位置是否确实存在,如果不存在,则将其退回到最后一行内。