Java扫雷程序非正方形棋盘地雷计数异常问题求助
解决Java扫雷非正方形棋盘的计数偏移问题
这种非正方形棋盘下的地雷计数偏移问题,我之前帮朋友排查过类似情况,大概率是你在处理相邻格子索引计算和边界判断时,错误沿用了正方形棋盘的等长逻辑,没有区分开总行数和总列数导致的。
常见的问题根源
- 一维数组索引转换错误:如果你的棋盘用一维数组存储,非正方形下的索引公式应该是
index = row * 总列数 + col。要是你错误写成了row * 总行数 + col(把列数当成行数来乘),会直接导致索引偏移,计数时找错相邻格子。比如10行15列的棋盘,第2行第0列的正确索引是2*15+0=30,如果写成2*10+0=20,就会定位到错误格子,计数自然混乱。 - 相邻格子边界判断混用行/列数:检查上下左右相邻格子时,行的范围要用总行数判断(
newRow >=0 && newRow < rowCount),列的范围要用总列数判断(newCol >=0 && newCol < colCount)。如果统一用同一个数值(比如正方形时的边长),非正方形场景下会出现边界判断错误,导致漏算或错算相邻地雷。 - 遍历范围的逻辑错误:遍历周围8个格子时,没有分别校验行和列的合法性,而是用同一个边长判断,比如错误写了
newCol < rowCount,列数大于行数时会误判列越界,反之则允许超出列范围的索引。
排查与修复步骤
- 检查索引转换代码:找到将二维坐标(row, col)转为一维数组索引的地方,确认公式是
row * colCount + col,绝对不要混用总行数。 - 修正边界判断逻辑:所有涉及行范围的判断用总行数
rowCount,列范围用总列数colCount,两者严格分开。 - 调试验证关键位置:找一个周围地雷数量明确的格子(比如周围有2个地雷),手动计算它的相邻格子索引,再对比程序计算结果,快速定位出错点。
错误代码示例与修复
比如错误的计数函数可能是这样的:
// 错误:混用了rowCount作为列的边界和索引计算 public int countAdjacentMines(int row, int col, int rowCount, int[] mineBoard) { int mineCount = 0; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (i == 0 && j == 0) continue; // 跳过当前格子 int adjacentRow = row + i; int adjacentCol = col + j; // 错误:列的边界用了rowCount if (adjacentRow >= 0 && adjacentRow < rowCount && adjacentCol >= 0 && adjacentCol < rowCount) { // 错误:索引计算用了rowCount int index = adjacentRow * rowCount + adjacentCol; if (mineBoard[index] == -1) { // 假设-1代表地雷 mineCount++; } } } } return mineCount; }
修复后的正确版本:
// 正确:区分rowCount和colCount public int countAdjacentMines(int row, int col, int rowCount, int colCount, int[] mineBoard) { int mineCount = 0; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (i == 0 && j == 0) continue; int adjacentRow = row + i; int adjacentCol = col + j; // 分别判断行和列的合法性 if (adjacentRow >= 0 && adjacentRow < rowCount && adjacentCol >= 0 && adjacentCol < colCount) { // 用colCount计算一维索引 int index = adjacentRow * colCount + adjacentCol; if (mineBoard[index] == -1) { mineCount++; } } } } return mineCount; }
总的来说,只要把所有涉及行、列长度的地方严格区分开,不再默认行和列长度相等,这个非正方形棋盘的计数偏移问题就能解决。
内容的提问来源于stack exchange,提问作者Data
相关产品推荐
相关产品推荐

