Kotlin扫雷开发:如何统计矩阵目标单元格周边地雷数量?
扫雷相邻单元格地雷统计实现(Kotlin)
先纠正你代码里的几个明显问题:
- 内层循环
j in 0 until i逻辑错误,应该遍历当前行的所有列,比如j in 0 until tablero[i].size(假设tablero是二维矩阵) - 参数
mines: Int没有实际作用,你需要传入存储地雷分布的二维数组tablero - 定义的
left、bottom等变量没必要,直接通过索引范围判断边界即可
核心逻辑是遍历目标单元格的8个相邻方向(上下左右+四个对角线),逐个检查每个方向的坐标是否在矩阵合法范围内,合法的话再判断是否是地雷,最后统计数量。
完整实现代码
// 假设tablero是存储地雷的二维数组:true表示该单元格有地雷,false表示无 fun countAdjacentMines(tablero: List<List<Boolean>>): List<List<Int>> { val totalRows = tablero.size if (totalRows == 0) return emptyList() val totalCols = tablero[0].size // 定义8个相邻方向的行、列偏移量 val adjacentDirections = listOf( -1 to -1, -1 to 0, -1 to 1, 0 to -1, 0 to 1, 1 to -1, 1 to 0, 1 to 1 ) // 初始化结果矩阵,存储每个单元格的相邻地雷数 val mineCountMatrix = MutableList(totalRows) { MutableList(totalCols) { 0 } } // 遍历每个单元格 for (row in 0 until totalRows) { for (col in 0 until totalCols) { var adjacentMineCount = 0 // 检查每个相邻方向 for ((rowOffset, colOffset) in adjacentDirections) { val adjacentRow = row + rowOffset val adjacentCol = col + colOffset // 确保相邻坐标在矩阵边界内 if (adjacentRow in 0 until totalRows && adjacentCol in 0 until totalCols) { // 如果该相邻单元格是地雷,计数+1 if (tablero[adjacentRow][adjacentCol]) { adjacentMineCount++ } } } mineCountMatrix[row][col] = adjacentMineCount } } return mineCountMatrix }
关键细节说明
- 方向偏移量:一次性列出所有8个可能的相邻位置,避免重复编写边界判断逻辑,代码更简洁易维护
- 边界检查:通过
adjacentRow in 0 until totalRows和adjacentCol in 0 until totalCols确保不会访问矩阵外的索引,避免数组越界异常 - 适配不同存储类型:如果你的
tablero是Int类型数组(比如1代表地雷,0代表空),只需要把判断条件改成tablero[adjacentRow][adjacentCol] == 1即可
内容的提问来源于stack exchange,提问作者Daniel Requena
相关产品推荐
相关产品推荐

