Algorithm 寻找一个算法,通过数学移动列表

Algorithm 寻找一个算法,通过数学移动列表,algorithm,math,Algorithm,Math,我有一张号码表。我不是把它们都画成一行,而是把清单画成五行 现在我可以选择一个数字,然后从那里向左、向右、向上或向下移动 在这15个数字(索引为0到14)的列表中,我选择了红色的索引11 如果我向左移动,我必须从我选择的索引中减去1。如果我向右移动,我加1。向下表示我加5,向上表示我减去5 但是,如果我在最下面一行时下楼,我希望在第一行结束,因此: 这方面的数学/算法很简单: index += 5; if (index > list.size() ) index = index % 5

我有一张号码表。我不是把它们都画成一行,而是把清单画成五行

现在我可以选择一个数字,然后从那里向左、向右、向上或向下移动

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

如果我向左移动,我必须从我选择的索引中减去1。如果我向右移动,我加1。向下表示我加5,向上表示我减去5

但是,如果我在最下面一行时下楼,我希望在第一行结束,因此:

这方面的数学/算法很简单:

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.
index-=5;
if(index<0)index+=index.size();
//所以:1-5=-4
//    -4 + 15 = 11.
但是如果我的列表不能被5整除,那么这就不起作用了


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

这可能可以进一步优化,但这里有一种方法:

var fullRows = list.Length / NUM_COLUMNS; //using integer division
var maxPos = fullRows * NUM_COLUMNS + currentIndex;
return maxPos < list.Length ? maxPos : maxPos - NUM_COLUMNS;
var fullRows=list.Length/NUM\u列//使用整数除法
var maxPos=fullRows*NUM_COLUMNS+currentIndex;
返回maxPos

这样做的目的是获取完整行的数量,然后假设后面还有一行。然后检查该位置是否真的存在,如果不存在,则将一行放在最后一整行内。

根据您的语言处理负数模的方式,
index=index%15
可能会也可能不会解决所有“索引超出范围”的问题同时出现问题。我不得不使用nRows而不是nFullRows,但它现在工作顺利。谢谢