所以我一直在努力解决这个问题。有人可以帮我弄清楚我哪里出错了吗?
它很贪婪,因为它移动到硬币数量最多的位置;它是懒惰的,因为如果没有邻近的位置增加它的硬币宝藏,它将停止移动。如果几个相邻位置具有相同最高数量的硬币,则收集器将选择以顺时针方式移动到最高位置。收集者从他们访问的任何地方清空硬币。
public static int receiveCoins(int[][]map,int r,int c){
int[] coins = {0,0,0,0};
boolean moreCoins = true;
int numOfCoins = 0;
if(map[r][c] > 0){
numOfCoins += map[r][c];
map[r][c] = 0;
}
while(moreCoins == true){
if(c < (map.length-1)){
if(map[r][c+1] > 0){
coins[1] = map[r][c+1];
}
}
if(r < map[0].length-1){
if(map[r+1][c] > 0){
coins[2] = map[r+1][c];
}
}
if(row > 0){
if(map[r-1][c] > 0){
coins[0] = map[r-1][c];
}
}
if(c > 0){
if(map[r][c-1] > 0){
coins[3] = map[r][c-1];
}
}
int maxCoin = 0;
int nRow = 0;
int nCol = 0;
for(int i = 0; i < coins.length; i++){
if(coins[i] > maxCoin){
maxCoin = coins[i];
if(i == 0){
nCol = c;
nRow = r - 1;
}else if(i == 1){
nRow = r;
nCol = c + 1;
}else if(i == 2){
nCol = c;
nRow = r + 1;
}else{
nRow = r;
nCol = c - 1;
}
}
coins[i] = 0;
}
}
}
if (maxCoin == 0){
moreCoins = false;
}else{
r = nRow;
c = nCol;
numOfCoins += map[r][c];
map[r][c] = 0;
}
}
return numOfCoins;
}
答案 0 :(得分:2)
对算法进行一些修正:
coins[]
重置为零,以便在下一次迭代中您不会重复使用上一次迭代中的值。例如,如果一个迭代中的值为非零,则下一个值为零。为什么break
接近尾声?这将导致您的程序在while
循环中的第一次迭代后总是中断。
map[row][col] = 0;
if(map[row][col] == 0){
break; // why?
}
检查最高值的下一个位置时,请确保将两者设置为,以防先前的位置被识别为最高位置。
if(coins[i] > highestCoin){
highestCoin = coins[i];
if(i == 0){
newCol = col; // this is important! do this for all cases!
newRow = row - 1;
}
...
}
切换两个边界比较。 row
应与map.length
进行比较,而col
应与map[0].length
进行比较。这是因为行可以被认为是垂直堆栈(因此表示二维数组中的第一个索引),而列可以被认为是构成堆栈的水平单位(因此出现在第二个索引中)。考虑首先选择堆栈,然后选择堆栈中的单元。
答案 1 :(得分:1)
我认为col必须小于(map.length-1)而不是(map.length-2) 对于{1},{1},map.length == 2 so map.length-2 = 0,则col必须小于0才能执行if块。 顺便说一句,你有col和行的map.length比较,所以你的地图在任何情况下都是正方形吗?