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

Java实现网格环绕式8邻域1计数函数的问题求助

网格环绕邻域1的统计解决方案

模运算在网格环绕中的作用

模运算(%)是实现网格边界环绕的核心:当计算出的行/列索引超出网格范围时,模运算能将其映射到网格的另一侧,让网格像球面一样首尾相连。举个例子:

  • 若网格总行数为totalRows,当计算出的行索引为-1时,(-1 + totalRows) % totalRows会得到totalRows-1(即最后一行)
  • 当索引等于totalRows时,totalRows % totalRows得到0(即第一行)

修正后的代码与说明

你的原始代码存在语法错误、未处理边界环绕、未排除目标单元格本身等问题,以下是修正后的完整实现:

public static int countNeighbours(int row, int col, Board b) {
    int count = 0;
    int totalRows = b.getRows(); // 从Board类获取网格总行数
    int totalCols = b.getCols(); // 从Board类获取网格总列数

    // 遍历目标单元格的8个邻域(含自身,后续跳过)
    for (int rOffset = -1; rOffset <= 1; rOffset++) {
        for (int cOffset = -1; cOffset <= 1; cOffset++) {
            // 跳过目标单元格自己,避免统计错误
            if (rOffset == 0 && cOffset == 0) {
                continue;
            }

            // 计算环绕后的邻域行索引:加totalRows确保数值为正,再取模避免越界
            int neighborRow = (row + rOffset + totalRows) % totalRows;
            // 计算环绕后的邻域列索引
            int neighborCol = (col + cOffset + totalCols) % totalCols;

            // 检查邻域单元格值是否为1,是则计数加1
            if (b.get(neighborRow, neighborCol) == 1) {
                count++;
            }
        }
    }
    return count;
}

关键细节说明

  1. 获取网格尺寸:必须先拿到网格的总行数和总列数,这是模运算的基础,需要确保Board类提供getRows()和getCols()方法(若方法名不同,对应修改即可)
  2. 跳过自身:8邻域的遍历范围包含目标单元格本身,必须通过continue跳过,否则会错误统计自己
  3. 处理负数索引:计算邻域索引时,先加上totalRows/totalCols,确保数值为正后再取模,避免Java中负数模运算返回负数的问题
  4. 正确调用get方法:假设Board类的get方法接受行和列两个参数来获取单元格值,若你的方法签名不同,需对应调整参数传递方式

内容的提问来源于stack exchange,提问作者astroprab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:01:19