我正在尝试使用已提供的测试文件来构建寻宝游戏。这些文本文件具有字符S,W,E,N和T,它们都与除T(宝藏)以外的所有方向相对应。一切正常,直到移动了行/列的长度。我怀疑它与for循环有关,但我不确定。 有没有没有for循环的方法,或者没有人有任何建议让它回到正轨吗?
这是到目前为止我的更新代码:
library(data.table)
nr <- 1e7L
ng <- nr/4L
set.seed(0L)
DT <- data.table(Subject=sample(ng, nr, TRUE), pt=1:nr)#rnorm(nr))
DT2 <- copy(DT)
microbenchmark::microbenchmark(times=3L,
mtd0 = {a0 <- DT[DT[, .I[which.max(pt)], by=Subject]$V1]},
mtd1 = {a1 <- DT[DT[order(-pt), .I[1L], Subject]$V1]},
mtd2 = {a2 <- DT2[DT2[, rn := .I][
order(Subject, -pt), rn[c(TRUE, diff(Subject)>0L)]
]]},
mtd3 = {a3 <- unique(DT[order(Subject, -pt)], by="Subject")}
)
fsetequal(a0[order(Subject)], a1[order(Subject)])
#[1] TRUE
fsetequal(a0[order(Subject)], a2[, rn := NULL][order(Subject)])
#[1] TRUE
fsetequal(a0[order(Subject)], a3[order(Subject)])
#[1] TRUE
这也是测试文件的示例。
Unit: seconds
expr min lq mean median uq max neval
mtd0 3.256322 3.335412 3.371439 3.414502 3.428998 3.443493 3
mtd1 1.733162 1.748538 1.786033 1.763915 1.812468 1.861022 3
mtd2 1.136307 1.159606 1.207009 1.182905 1.242359 1.301814 3
mtd3 1.123064 1.166161 1.228058 1.209257 1.280554 1.351851 3
这个应该返回3,这是移动的次数(在我的代码中是转数),但是相反,它到达W(需要2个移动)并返回-2,这仅用于当它移动到更多位置时不止一次。此外,并非所有的阵列都是正方形,例如一些是1x200或4x5。 我将不胜感激!
答案 0 :(得分:0)
如果您知道木板是这样的,那么从(0,0)开始,您就不会陷入循环中或离开木板,您可以使用类似以下的方法:
public int playGame()
{
int numMoves = 0;
int currentRow = 0;
int currentCol = 0;
while(gameBoard[currentRow][currentCol] != 'T')
{
switch (gameBoard[currentRow][currentCol])
{
case 'E': currentCol++; break;
case 'W': currentCol--; break;
case 'S': currentRow--; break;
case 'N': currentRow++; break;
default:
throw new IllegalStateException("Unrecognized Move");
}
numMoves++;
}
return numMoves;
}
您可能要使用if-then-else
而不是switch
。
如果您需要检查循环或车外运动,则应该可以添加这些检查。