有一个大小为N*M
的迷宫,由单位块组成。一开始机器人的电池充电率为R
%。现在机器人从第1行开始向第N行移动。从当前块中,机器人可以移动到下一行中的块,该块位于当前块的右侧或左侧。在第i行第j列移动到块时,如果C(i,j)
大于0,则机器人电池电量将减少C(i,j)
%,否则将按C(i,j)
%充电。
例如,如果电池有50%的电量,在用C(i,j) = 15
移动到阻止时,电池将有35(50-15)%的电量。
现在我们想要了解电池的最终状态,如果机器人最佳地移动以节省最大电量。
注意:电池电量不会超过100%,如果电池电量降至0%,机器人将无法进一步移动。
示例:LET N*M
网格为4*4
,如下所示:
10 -10 10 -10
-10 10 -10 10
5 -5 5 -5
-5 -5 -5 -5
如果初始电池充电为50(= R),那么这里的答案将是80,因为其中一个最佳动作将是
<1,2> -> <2,1> -> <3,2> -> <4,1>
在这一举动中,机器人获得了30%的电量,因此最终电池将有80%的电量。
答案 0 :(得分:0)
显然,所描述的问题是具有负运动成本的路径发现问题。特别是如果您的机器人的电池可能被过度充电。这类问题通常由A-star searching algorithm解决。
答案 1 :(得分:0)
这个问题有一个简单的算法:
int charge(int x, int y, int battery){
//Check to see if we've been in this cell with this battery before
//You'll have to write the functions hasMemorized and memorized to return the value
//In Java you can use a simple hash map
if (hasMemorized(x, y, battery)){
return memorized(x, y, battery);
}
if (battery<0 || x<0 || x>=N){
//We are dead and cannot move
return -Inf;
}
if (y>=M){
//We have reached our goal; return battery
return battery;
}
//Otherwise, try again
int val =MAX( charge(x-1, y+1, battery-cost(x-1, y+1)),
charge(x, y+1, battery-cost(x, y+1)),
charge(x+1, y+1, battery-cost(x+1, y+1)));
setMemorized(x,y,battery, val);
return val;
}
然后致电:
int optimalCharge =
MAX( charge(1, 0, 100),
charge(2, 0, 100),
...
charge(N-1, 0, 100));