From f1633ee8d50074069af3f390bde4eb8044ae36ac Mon Sep 17 00:00:00 2001 From: rendo Date: Wed, 1 Apr 2026 10:06:17 +0500 Subject: [PATCH] Correct display --- rust-pvz-genetics/src/genetics/genome.rs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/rust-pvz-genetics/src/genetics/genome.rs b/rust-pvz-genetics/src/genetics/genome.rs index 90ba3ea..42fe494 100644 --- a/rust-pvz-genetics/src/genetics/genome.rs +++ b/rust-pvz-genetics/src/genetics/genome.rs @@ -22,7 +22,10 @@ impl Genome { return Err(PlantCreationError::EmptyEdges); } - let mut graph: Vec<(Gene,Vec)>= nodes.iter().map(|gene|{(gene.clone(),Vec::new())}).collect(); + let mut graph: Vec<(Gene,Vec)> = Vec::new(); + for gene in nodes { + graph.push((gene,Vec::new())); + } for edge in edges { graph[edge.0].1.push(edge.1); } @@ -36,13 +39,15 @@ impl Genome { impl Display for Genome { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let indents = { - let mut result: Vec<(usize,Gene)> = vec![(0,self.graph[0].0.clone())]; - let mut tree: VecDeque<(usize,&Vec)> = VecDeque::from([(0,&self.graph[0].1)]); - while tree.is_empty() == false { - let (depth,children) = tree.pop_front().unwrap(); - for child in children { - result.push((depth+1,self.graph[*child].0.clone())); - tree.push_back((depth+1,&self.graph[*child].1)); + let mut result: Vec<(usize, Gene)> = Vec::new(); + let mut stack: Vec<(usize, usize)> = vec![(0, 0)]; // (node_index, depth) + + while let Some((node, depth)) = stack.pop() { + result.push((depth, self.graph[node].0.clone())); + + // push in reverse so left-most child is processed first + for &child in self.graph[node].1.iter().rev() { + stack.push((child, depth + 1)); } }