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; }
关键细节说明
- 获取网格尺寸:必须先拿到网格的总行数和总列数,这是模运算的基础,需要确保Board类提供
getRows()和getCols()方法(若方法名不同,对应修改即可) - 跳过自身:8邻域的遍历范围包含目标单元格本身,必须通过
continue跳过,否则会错误统计自己 - 处理负数索引:计算邻域索引时,先加上
totalRows/totalCols,确保数值为正后再取模,避免Java中负数模运算返回负数的问题 - 正确调用get方法:假设Board类的
get方法接受行和列两个参数来获取单元格值,若你的方法签名不同,需对应调整参数传递方式
内容的提问来源于stack exchange,提问作者astroprab
相关产品推荐
相关产品推荐

