Bonjour,
j’explore le défis https://projecteuler.net/problem=736, même si je n’ai pas grand espoir de le résoudre.
J’ai fait un code qui me génère les pairs équivalents, maintenant j’aimerais observer les chemins menant à ces égalités. J’aimerai donc stocker dans un set les éléments visités ainsi que l’élément précédent.
use std::collections::{BTreeSet, VecDeque};
type Node = (u32,u32);
fn r((x,y) : Node) -> Node {
(x + 1, 2 * y)
}
fn s((x,y) : Node) -> Node {
(2 * x, y + 1)
}
fn solve_path_to_equality((a,b) : Node) -> bool {
let mut to_visit: VecDeque<Node> = VecDeque::with_capacity(2_usize.pow(10));
let mut visited = BTreeSet::new();
to_visit.push_back((a, b));
let mut n = 1_usize;
loop {
let (a, b) = to_visit.pop_front().unwrap();
if !visited.insert((a,b)) { //it's not a new element
continue;
}
let child1 = s((a, b));
let child2 = r((a, b));
n = n + 1;
if child1.0 == child1.1 {
println!("({}, {}) generated with s(x,y) | {}",child1.0, child1.1, (n as f64).log2().floor()+1f64);
}
n = n + 1;
if child2.0 == child2.1 {
println!("({}, {}) generated with r(x,y) | {}",child2.0,child2.1,(n as f64).log2().floor()+1f64);
}
to_visit.push_back(child1);
to_visit.push_back(child2);
}
}
fn main() {
solve_path_to_equality((45, 90));
}
Le code est assez simple : je pars de (45,90) je génère les deux enfants : r(45,90) et s(45,90) je les ajoute à la fin de ma queue d’exploration je continue d’explorer en prenant de ma queue le premier élément.
je parcours ainsi en BFS les pairs. je chercher maintenant à construire le chemin de (45,90) à x,y avec x==y
.
le problème c’est que je ne sais pas vraiment comment avoir une reférence / pointeur sur l’élément qui a générer la solution dans mon set l’idée est que chaque élément de mon set aille un pointeur sur son parent et lorsque je trouve une solution x==y
je retrace la chaine comme une linkedlist.
Mais avec rust j’ai de la peine a déclarer les lifetimes de mes iterateurs (et la syntaxe pour déclarer un iterateur) qui doivent avoir une durée de vie équivalent à mon set.
est-ce que vous pourriez me donner un coup de main pour déclarer un iterateur de type I sur un tuple (u32,u32, I) contenu dans un BTreeMap. Est-ce qu’en ajoutant les éléments, l’arbre va s’équilibré et donc un itérateur peut devenir invalide selon l’implémentation ?
Sinon vous conseillez-quoi comme manière de stocker la chaine des parents, avoir un vec<u32> pour chaque élément retraçant le chemin en entier me semble très inefficace. Surtout que j’essaie d’être efficace car l’algo est exponentiel.