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

时间:2013-09-09 03:39:54

标签: java arrays algorithm loops if-statement

所以我一直在努力解决这个问题。有人可以帮我弄清楚我哪里出错了吗?

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

 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;   
    }

2 个答案:

答案 0 :(得分:2)

对算法进行一些修正:

  1. 来自 user1509803
  2. 的建议
  3. 在检查最高值后,您应该将coins[]重置为零,以便在下一次迭代中您不会重复使用上一次迭代中的值。例如,如果一个迭代中的值为非零,则下一个值为零。
  4. 为什么break接近尾声?这将导致您的程序在while循环中的第一次迭代后总是中断。

      map[row][col] = 0;
    
      if(map[row][col] == 0){
          break; // why?
      }
    
  5. 检查最高值的下一个位置时,请确保将两者设置为,以防先前的位置被识别为最高位置。

        if(coins[i] > highestCoin){
    
            highestCoin = coins[i];
    
            if(i == 0){
                newCol = col; // this is important! do this for all cases!
                newRow = row - 1;
    
            }   
            ...     
        }    
    
  6. 切换两个边界比较。 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比较,所以你的地图在任何情况下都是正方形吗?