Java 2d阵列游戏,移动到相邻空间拾取硬币

Java 2d阵列游戏,移动到相邻空间拾取硬币,java,arrays,algorithm,loops,if-statement,Java,Arrays,Algorithm,Loops,If Statement,所以我今天大部分时间都在研究这个问题。有人能帮我找出哪里出错了吗 它贪婪是因为它移动到硬币数量最多的地方;它是懒惰的,因为如果没有相邻的位置增加它的硬币宝藏,它将停止移动。如果几个相邻的地点拥有相同数量的最高硬币,采集者将选择顺时针移动到最高的位置。采集者从它访问的任何位置清空硬币 public static int receiveCoins(int[][]map,int r,int c){ int[] coins = {0,0,0,0}; boolean

所以我今天大部分时间都在研究这个问题。有人能帮我找出哪里出错了吗

它贪婪是因为它移动到硬币数量最多的地方;它是懒惰的,因为如果没有相邻的位置增加它的硬币宝藏,它将停止移动。如果几个相邻的地点拥有相同数量的最高硬币,采集者将选择顺时针移动到最高的位置。采集者从它访问的任何位置清空硬币

 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;   
    }
public static int receiveCoins(int[]map,int r,int c){
int[]硬币={0,0,0};
布尔值=真;
int numOfCoins=0;
如果(映射[r][c]>0){
numOfCoins+=map[r][c];
map[r][c]=0;
}  
而(moreCoins==true){
如果(c<(地图长度-1)){
如果(映射[r][c+1]>0){
硬币[1]=地图[r][c+1];
}               
}
if(r0){
硬币[2]=地图[r+1][c];
}               
}
如果(行>0){
如果(映射[r-1][c]>0){
硬币[0]=地图[r-1][c];
}
}
如果(c>0){
如果(地图[r][c-1]>0){
硬币[3]=地图[r][c-1];
}               
}           
int-maxCoin=0;
int nRow=0;
int-nCol=0;
for(int i=0;imaxCoin){
马克斯币=硬币[i];
如果(i==0){
nCol=c;
nRow=r-1;
}else如果(i==1){
nRow=r;
nCol=c+1;
}else如果(i==2){
nCol=c;
nRow=r+1;
}否则{
nRow=r;
nCol=c-1;
}
}   
硬币[i]=0;
}           
}               
}
如果(maxCoin==0){
更多硬币=假;
}否则{
r=nRow;
c=nCol;
numOfCoins+=map[r][c];
map[r][c]=0;
}   
}
归还钱币;
}

我认为col必须小于(map.length-1)而不是(map.length-2) 对于{1}、{1},map.length==2,所以map.length-2=0,则col必须小于0才能执行if块。
顺便说一句,您对col和row都有map.length比较,所以您的map在任何情况下都是正方形?

我认为col必须小于(map.length-1)而不是(map.length-2) 对于{1}、{1},map.length==2,所以map.length-2=0,则col必须小于0才能执行if块。
顺便说一句,您对col和row都有map.length比较,因此您的映射在任何情况下都是正方形?

对您的算法进行一些更正:

  • 用户建议1509803
  • 在检查硬币的最高值后,应将硬币[]重置为零,以便在下一次迭代中不会重用上一次迭代中的值。例如,如果一个值在一次迭代中为非零,然后在下一次迭代中为零
  • 为什么
    在接近尾声时中断
    ?这将导致程序在
    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;
    
            }   
            ...     
        }    
    
  • 切换两个边界比较<代码>行应与
    映射进行比较。长度
    ,而
    应与
    映射[0]进行比较。长度
    。这是因为行可以被视为垂直堆栈(因此代表二维数组中的第一个索引),而列可以被视为构成堆栈的水平单元(因此出现在第二个索引中)。考虑先选择堆栈,然后选择堆栈中的单元


  • 对算法的一些更正:

  • 用户建议1509803
  • 在检查硬币的最高值后,应将硬币[]重置为零,以便在下一次迭代中不会重用上一次迭代中的值。例如,如果一个值在一次迭代中为非零,然后在下一次迭代中为零
  • 为什么
    在接近尾声时中断
    ?这将导致程序在
    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;
    
            }   
            ...     
        }    
    
  • 切换两个边界比较<代码>行应与
    映射进行比较。长度
    ,而
    应与
    映射[0]进行比较。长度
    。这是因为行可以被视为垂直堆栈(因此代表二维数组中的第一个索引),而列可以被视为构成堆栈的水平单元(因此出现在第二个索引中)。考虑先选择堆栈,然后选择堆栈中的单元


  • 我原来有它-1,但我忘了在发布代码之前把它改回去。在那一点上,我是绝望的,只是改变事情,看看会发生什么。Map是一个2d数组,所以它看起来要么像一个矩形,要么像一个正方形板。我认为{1},{1}不是一个正方形板,rowlength==1,colLength==2?不,它是一个矩形。该委员会的指数将为[0][0]高于[1][0]。另外,设置更多的硬币为假确实把我从无休止的循环中敲了出来,但是