如何在String[][]网格中查询选中点8邻域内的E或P元素?
检查网格点位8邻域是否存在E或P的实现方案
嘿,这问题我熟!要搞定这个8邻域检索的需求,核心就是处理边界合法性+遍历所有方向,我给你拆解成可落地的步骤和代码示例:
核心思路
- 定义8个邻域的坐标偏移量:把上下左右、四个对角线的相对坐标列出来,不用硬写8次重复判断
- 边界校验:每个偏移后的坐标必须落在网格的有效范围内(不能小于0,也不能超过网格的行/列数)
- 遍历判断:对每个合法的邻域点位,检查值是否为
E或P,找到匹配项就直接返回结果
代码实现(Java示例)
假设你的网格是String[][] grid,选中点位的行是targetRow、列是targetCol,可以写一个实用的工具方法:
public boolean hasEorPInNeighbors(String[][] grid, int targetRow, int targetCol) { // 先处理网格为空或目标点位不合法的异常情况 if (grid == null || grid.length == 0 || targetRow < 0 || targetRow >= grid.length) { return false; } String[] targetRowArr = grid[targetRow]; if (targetRowArr == null || targetCol < 0 || targetCol >= targetRowArr.length) { return false; } // 定义8个邻域的坐标偏移:[行偏移量, 列偏移量] int[][] directions = { {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1} }; // 遍历每个方向的邻域 for (int[] dir : directions) { int neighborRow = targetRow + dir[0]; int neighborCol = targetCol + dir[1]; // 检查邻域坐标是否在网格合法范围内 if (neighborRow >= 0 && neighborRow < grid.length) { String[] neighborRowArr = grid[neighborRow]; if (neighborCol >= 0 && neighborCol < neighborRowArr.length) { String value = neighborRowArr[neighborCol]; // 判断是否匹配E或P,如需忽略大小写可改用equalsIgnoreCase if ("E".equals(value) || "P".equals(value)) { return true; } } } } // 遍历完所有邻域都未找到匹配项 return false; }
额外注意事项
- 如果你的网格是不规则的(行长度不一致),代码里的
neighborRowArr.length判断能避免数组越界问题 - 要是需要支持大小写不敏感匹配(比如
e或p也符合条件),把判断逻辑改成"E".equalsIgnoreCase(value) || "P".equalsIgnoreCase(value)即可 - 可以根据业务需求调整逻辑:比如把找到第一个匹配就返回,改成收集所有匹配的邻域点位,灵活性拉满
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

