是否存在生成网格节点特定连接模式的通用算法?
解决网格节点相邻连接的通用算法
问题分析
你用itertools.combinations得到的是所有节点对的全连接,而网格的目标连接是**相邻节点(上下、左右)**的连接,所以需要过滤掉不相邻的节点对。
实现思路
假设节点列表是行优先排列的(比如3x3网格的节点顺序是:第1行0,1,2;第2行3,4,5;第3行6,7,8),我们可以通过节点索引判断是否相邻:
- 左右相邻:两个节点索引差为1,且处于同一行(即
(i+1) % cols != 0,其中cols是网格列数) - 上下相邻:两个节点索引差为cols(即
j = i + cols,且j < 总节点数)
你可以直接基于这个逻辑过滤combinations的结果,或者直接生成符合条件的连接对。
代码实现
方法1:过滤itertools.combinations的结果
from itertools import combinations def generate_grid_connections(points, cols): total_nodes = len(points) connections = [] for pair in combinations(range(total_nodes), 2): i, j = sorted(pair) # 判断左右相邻 if j == i + 1 and (i + 1) % cols != 0: connections.append(pair) # 判断上下相邻 elif j == i + cols: connections.append(pair) return connections # 示例:3x3网格 points_3x3 = list(range(9)) cols_3x3 = 3 connections_3x3 = generate_grid_connections(points_3x3, cols_3x3) print("3x3网格连接:", connections_3x3) # 示例:4x3网格 points_4x3 = list(range(12)) cols_4x3 = 4 connections_4x3 = generate_grid_connections(points_4x3, cols_4x3) print("4x3网格连接:", connections_4x3)
方法2:直接生成连接(更高效)
不需要用combinations,直接循环生成相邻对,避免无意义的全量节点对生成,性能更优:
def generate_grid_connections(points, cols): total_nodes = len(points) connections = [] for i in range(total_nodes): # 连接右边节点(如果不是行尾) if (i + 1) % cols != 0: connections.append((i, i+1)) # 连接下方节点(如果不是最后一行) if i + cols < total_nodes: connections.append((i, i+cols)) return connections # 调用示例同方法1
说明
- 你需要传入网格的列数
cols(比如3x3网格cols=3,4x3网格cols=4),因为仅通过节点列表无法自动推断行列结构(比如6个节点可能是2x3或3x2)。 - 两种方法都能生成符合要求的网格连接模式,方法2更适合大网格场景。
内容的提问来源于stack exchange,提问作者user20896142
相关产品推荐
相关产品推荐

