JavaScript实现二维数组相邻雷数统计(扫雷开发场景)
扫雷雷数计算的简易实现方案
你最初想到的遍历8个周边坐标的思路完全正确,边缘位置缺少相邻坐标的问题不需要复杂的特殊分支,只要在读取相邻坐标值之前加一层合法性校验,越界的位置直接跳过不参与计数就能解决。
核心处理逻辑
- 所有格子的计算逻辑完全统一,不需要单独给角落、边侧的格子写差异化判断
- 合法边界判定规则很简单:如果计算出来的相邻坐标超出了数组的总行数、总列数范围,就说明这个方向不存在相邻格子,直接跳过即可
分步实现
1. 预先整理8个方向的坐标偏移量
把上下左右、四个斜角的坐标差提前列成固定数组,避免手动写多个相邻坐标时漏算方向:
const directionList = [ [-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1] ]
2. 逐格遍历做判定
- 先获取原数组的总行数、每一行的总列数作为合法边界
- 遍历到每个格子时,先判断本身是不是地雷(值为9),是的话直接把9填入结果,跳过周边计算
- 对非地雷的空白格,依次遍历所有8个方向,对每个方向算出的相邻坐标做合法性校验
举个实际校验的例子:第一行第一列的坐标是(0,0),算左上方向的相邻坐标时会得到(-1,-1),因为-1小于合法坐标的最小值0,直接判定为越界,跳过这个方向的计数就行,完全不会触发数组越界报错。
3. 完整可运行代码
代码运行后的输出和你给出的目标数组完全一致:
// 初始输入数组 const inputGrid = [ [0, 9, 0, 0], [0, 0, 9, 0], [0, 9, 0, 9], [9, 9, 0, 0], ] // 8个方向的偏移量 const directionList = [ [-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1] ] function calculateMineCount(grid) { const totalRows = grid.length if (totalRows === 0) return [] const totalCols = grid[0].length // 初始化和原数组大小一致的结果数组 const result = Array.from({length: totalRows}, () => new Array(totalCols).fill(0)) for (let x = 0; x < totalRows; x++) { for (let y = 0; y < totalCols; y++) { // 本身是地雷直接填值 if (grid[x][y] === 9) { result[x][y] = 9 continue } // 遍历周边数雷 let adjacentMine = 0 for (const [dx, dy] of directionList) { const neighborX = x + dx const neighborY = y + dy // 判断相邻坐标是否在合法范围内 const isXValid = neighborX >= 0 && neighborX < totalRows const isYValid = neighborY >= 0 && neighborY < totalCols // 坐标合法且对应位置是雷,计数+1 if (isXValid && isYValid && grid[neighborX][neighborY] === 9) { adjacentMine++ } } result[x][y] = adjacentMine } } return result } // 调用即可得到目标输出 const output = calculateMineCount(inputGrid)
新手开发小提示:不要直接修改原输入数组的内容,单独生成结果数组存计算值,避免后续开发时覆盖原雷位数据,出现难以排查的bug。
内容的提问来源于stack exchange,提问作者Jayden Sayed
相关产品推荐
相关产品推荐

