试图检查Matrix中相邻的所有内容

时间:2018-02-28 01:44:29

标签: java matrix project

我想知道是否有更简单的方法可以做到这一点?该项目要求我编写此方法,该方法使用另一种方法,如果存在宝藏,则返回布尔值true或false。我得到了那个方法,但它现在要我编写一个方法,返回相邻(在所有方向上)多少宝藏到行和列中的设定位置。我把它映射到一张纸上然后出来......这个。但是,我觉得我正在重复代码,但我不明白任何其他方式可以满足条件。我希望它更加浓缩......我在想2循环?但是有两个条件在for循环中不起作用。

    //precondition: 0<=row<rows in map and 0<=col<cols in map
//postcondition: returns a count of the number of treasures in the cells adjacent to the location row,col 
//horizontally, vertically, and diagonally.  
public int numAdjacent(int row, int col) {
    if(hasTreasure(row,col)) {
        return -1;
    }

    int numOfTreasure = 0;
    if ((0<=row && row < mapHeight()) && (0<=col && col < mapWidth())) {
        if(hasTreasure(row - 1,col - 1)) {
            numOfTreasure++;
        }
    }
    if (0<=row && row < mapHeight()) {
        if(hasTreasure(row - 1,col)) {
            numOfTreasure++;
        }
    }
    if ((0<=row && row < mapHeight()) && 0<=col && col < mapWidth()) {
        if(hasTreasure(row - 1,col + 1)) {
            numOfTreasure++;
        }
    }
    if (0<=row && row < mapHeight()) {
        if(hasTreasure(row + 1,col)) {
            numOfTreasure++;
        }
    }
    if ((0<=row && row < mapHeight()) && 0<=col && col < mapWidth()) {
        if(hasTreasure(row + 1,col + 1)) {
            numOfTreasure++;
        }
    }
    if ((0<=row && row < mapHeight()) && 0<=col && col < mapWidth()) {
        if(hasTreasure(row + 1,col - 1)) {
            numOfTreasure++;
        }
    }
    if (0<=col && col < mapWidth()) {
        if(hasTreasure(row,col + 1)) {
            numOfTreasure++;
        }
    }
    if (0<=col && col < mapWidth()) {
        if(hasTreasure(row,col - 1)) {
            numOfTreasure++;
        }
    }
    return numOfTreasure;
}

1 个答案:

答案 0 :(得分:0)

使用嵌套for循环,你在正确的轨道上!因为我们正在处理一个矩阵,所以每个元素都有8个相邻的邻居,可以找到宝藏。出于这个原因,我们可以使用嵌套的for循环来检查每个相邻的邻居是否有宝藏;如果邻居的坐标超出界限,我们只需在循环内跳过它。

public int numAdjacent(int row, int col) {
    int numOfTreasure = 0;

    for (int currentCol = Math.max(0, col - 1); currentCol <= Math.min(col + 1, mapWidth() - 1); currentCol++) {
        for (int currentRow = Math.max(0, row - 1); currentRow <= Math.min(row + 1, mapHeight() - 1); currentRow++) {
            numOfTreasure += hasTreasure(currentRow, currentCol) ? 1 : 0;
        }
    }

    return numOfTreasure;
}

一旦理解了for循环,就可以进一步简化:

mergeMap