我想知道是否有更简单的方法可以做到这一点?该项目要求我编写此方法,该方法使用另一种方法,如果存在宝藏,则返回布尔值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;
}
答案 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