n×n二维数组四邻接连接场景下索引越界的高效检查方法
n×n二维数组节点邻接连接的索引越界优化问题
我有一个n×n的二维数组,需要将随机点与其四个相邻节点连接,相关示意图为网格四邻接节点示意图。
我最初想要使用如下代码实现:
connect(p, p - n); connect(p, p + n); connect(p, p - 1); connect(p, p + 1);
目前遇到的问题是数组边缘的节点会出现索引越界。我最开始通过创建大小为(n + 2)×(n + 2)的数组解决该问题,这种方式能保持代码的简洁性,但不符合作业的存储要求,要求数组必须为n×n规格。
我查阅资料后调整了算法,代码如下:
connect(grid[i][j], grid[Math.max(0, i-1)][j]); connect(grid[i][j], grid[Math.min(n - 1, i+1)][j]); connect(grid[i][j], grid[i][Math.max(0, j-1)]); connect(grid[i][j], grid[i][Math.min(n - 1, j+1)]);
但现在的实现会在索引越界时将节点与自身连接。需要更优质、更简洁的索引越界检查方法。
解决方案
你可以预先判断相邻坐标是否在合法区间内,只有符合要求才执行连接操作,完全避免自连问题。
基础清晰写法
逻辑直白易读,适合新手理解:
// 连接上方相邻节点 if (i - 1 >= 0) connect(grid[i][j], grid[i-1][j]); // 连接下方相邻节点 if (i + 1 < n) connect(grid[i][j], grid[i+1][j]); // 连接左侧相邻节点 if (j - 1 >= 0) connect(grid[i][j], grid[i][j-1]); // 连接右侧相邻节点 if (j + 1 < n) connect(grid[i][j], grid[i][j+1]);
精简拓展写法
把方向偏移量统一存储,循环处理,后续如果要新增斜向相邻节点的连接逻辑,只需要修改偏移量数组即可,拓展性更强:
// 四个方向的[i,j]偏移量:上、下、左、右 int[][] dirs = {{-1,0}, {1,0}, {0,-1}, {0,1}}; for (int[] dir : dirs) { int ni = i + dir[0]; int nj = j + dir[1]; // 仅当相邻坐标在合法区间内时执行连接 if (ni >= 0 && ni < n && nj >=0 && nj < n) { connect(grid[i][j], grid[ni][nj]); } }
两种写法均严格符合n×n数组的存储要求,不会产生自连问题,第二种写法代码更简洁,复用性更高。
内容的提问来源于stack exchange,提问作者Theresa M
相关产品推荐
相关产品推荐

