Skip to main content

god_graph/generators/
grid.rs

1//! 网格图生成器
2
3use crate::graph::builders::GraphBuilder;
4use crate::graph::Graph;
5
6/// 生成 2D 网格图
7///
8/// # 参数
9/// * `rows` - 行数
10/// * `cols` - 列数
11/// * `diagonal` - 是否包含对角线连接
12///
13/// # 返回
14/// 生成的网格图
15pub fn grid_graph<T>(rows: usize, cols: usize, diagonal: bool) -> Graph<T, f64>
16where
17    T: Clone + Default,
18{
19    let n = rows * cols;
20    let mut builder = GraphBuilder::undirected().with_nodes((0..n).map(|_| T::default()));
21
22    for r in 0..rows {
23        for c in 0..cols {
24            let idx = r * cols + c;
25
26            // 向右连接
27            if c + 1 < cols {
28                builder = builder.with_edge(idx, idx + 1, 1.0);
29            }
30
31            // 向下连接
32            if r + 1 < rows {
33                builder = builder.with_edge(idx, idx + cols, 1.0);
34            }
35
36            // 对角线连接
37            if diagonal {
38                if r + 1 < rows && c + 1 < cols {
39                    builder = builder.with_edge(idx, idx + cols + 1, 1.0);
40                }
41                if r + 1 < rows && c > 0 {
42                    builder = builder.with_edge(idx, idx + cols - 1, 1.0);
43                }
44            }
45        }
46    }
47
48    builder.build().unwrap_or_else(|_| Graph::undirected())
49}