You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,列数大于行数时会误判列越界,反之则允许超出列范围的索引。

排查与修复步骤

  1. 检查索引转换代码:找到将二维坐标(row, col)转为一维数组索引的地方,确认公式是 row * colCount + col,绝对不要混用总行数。
  2. 修正边界判断逻辑:所有涉及行范围的判断用总行数rowCount,列范围用总列数colCount,两者严格分开。
  3. 调试验证关键位置:找一个周围地雷数量明确的格子(比如周围有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:56:09