use crate::graph::builders::GraphBuilder;
use crate::graph::Graph;
pub fn grid_graph<T>(rows: usize, cols: usize, diagonal: bool) -> Graph<T, f64>
where
T: Clone + Default,
{
let n = rows * cols;
let mut builder = GraphBuilder::undirected().with_nodes((0..n).map(|_| T::default()));
for r in 0..rows {
for c in 0..cols {
let idx = r * cols + c;
if c + 1 < cols {
builder = builder.with_edge(idx, idx + 1, 1.0);
}
if r + 1 < rows {
builder = builder.with_edge(idx, idx + cols, 1.0);
}
if diagonal {
if r + 1 < rows && c + 1 < cols {
builder = builder.with_edge(idx, idx + cols + 1, 1.0);
}
if r + 1 < rows && c > 0 {
builder = builder.with_edge(idx, idx + cols - 1, 1.0);
}
}
}
}
builder.build().unwrap_or_else(|_| Graph::undirected())
}