/// <summary> /// Ouvre le nouveau dictionnaire fourni par Pijaku, celui ci est présenté au format csv. /// Cependant notre ami nous a mis quelques pièges, le dernier mot de chaque ligne est suivi d'un ; et il y a une ligne vide entre deux lignes de mots /// Un simple split sur les ; et les \r\n ne donc suffit pas /// </summary> /// <param name="path"></param> /// <returns></returns> public void Ouvrir(string path) { char[] separateurs = { ';' };//le split se fera juste sur les ; //je charge tout le fichier dans RedAllText, supprime les retours de lignes avec Replace, Splite, et enlève les eventuelles chaines vides avec Except //Dico est une List pour que la requete soit executée aussitôt. dico = File.ReadAllText(path, Encoding.ASCII).Replace("\r\n","").Split(separateurs).Except(new [] {""}).ToList<string>(); }
List<T> mesMots = monDico.Where(c => c.StartWith(«A»)).ToList<string>();
List<T> mesMots = monDico.FindAll(c => c.StartWith(«A»));
//première réduction du dico avec seulement les lettres tirées sur suggetion de Ucfoutu, utilisation de regex string[] alphabet = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; var lettres = alphabet.Except(tires.Select(c => c.FaceVisible).Distinct());//liste des lettres non tirées Regex maRegex = new Regex(string.Format("^[^{0}]+$",string.Join("",lettres))); List<string> dicoExclu = MonDico.Liste.FindAll(c => maRegex.IsMatch(c));
/// <summary> /// Recherche par progression successive dans la grille, on teste s'il existe encore des mots commencant par le chemin /// en cours avant d'enclencher une instance supplémentaire. /// </summary> /// <param name="chemin">Chemin en cours</param> /// <param name="dico">dictionnaire appuré à chaque instance, il est impérativement sous forme de liste, en effet un Ienumerable créé par Linq sera évalué à postériori et dans les recursions succesives ça met le bazard/param> private void RechercheRecursive(Chemin chemin, List<string> dico) { List<De> adjacents =chemin.DernierDe.Adjacents(tires, chemin.Des); if (adjacents.Count() == 0) return; foreach (De d in adjacents) { Chemin monChemin = chemin.Clone(); monChemin.Des.Add(d); List<string> dicoReduit = dico.FindAll(m => m.StartsWith(monChemin.Texte));//je commence par réduire le dictionnaire à la liste des mots commençant par le chemin en cours if (dicoReduit.Count() > 0) { if (monChemin.Texte.Length > 2 && !chemins.Exists(m => m.Texte == monChemin.Texte) && dicoReduit.Exists(m => m == monChemin.Texte))//si le mot n'est pas déjà listé, et s'il existe on stocke le chemin chemins.Add (monChemin ); RechercheRecursive(monChemin, dicoReduit);//s'il existe des mots commençant par cette séquence on continue } else continue;//sinon on passe au dé adjacent suivant } }
/// <summary> /// Recherche dé par dé /// </summary> /// <param name="dicoExclu"></param> private void LanceRecherche(List<string> dicoExclu) { //début de la recherche Dé, par dé en lancant la méthode récursive foreach (De d in tires) { Chemin monChemin = new Chemin(); monChemin.Des.Add(d); List<string> dicoReduit = dicoExclu.FindAll(c => c.StartsWith(monChemin.Texte)); if (dicoReduit.Count() > 0) RechercheRecursive(monChemin, dicoReduit); }
public class De { private string faces; /// <summary> /// Construit un dé à partir d'un string listant chaque face /// </summary> /// <param name="Faces"></param> public De(string Faces) { faces = Faces; } /// <summary> /// Construit un dé sans faces pour les grilles saisies /// </summary> public De(string FaceVisible, int Index) { this.FaceVisible = FaceVisible; this.Index=Index; Y = Index / 4; X = Index - 4 * Y; } /// <summary> /// Abscise du dé dans le tableau /// </summary> public int X { get; set; } /// <summary> /// Ordonnée du dé dans le tableau /// </summary> public int Y { get; set; } /// <summary> /// Face visible après le tirage /// </summary> public string FaceVisible { get; set; } /// <summary> /// Index du dé dans la liste /// </summary> public int Index { get; set; } /// <summary> /// Méthode choisant aléatoirement la face visible, les coordonnées du dé dans le plateau sont transférés par cette méthode /// </summary> /// <param name="X"></param> /// <param name="Y"></param> public void Tirage(int X, int Y, Random rdm) { FaceVisible = faces[rdm.Next(faces.Length-1)].ToString(); this.X = X; this.Y = Y; Index = 4 * Y + X; } /// <summary> /// Retourne les dés adjacents à l'instance en cours, en sortant les dés contenus dans la liste exception /// </summary> /// <param name="Tirage">Tableau de dés correspond au tirage</param> /// <param name="excepetions">Liste de dés à exclure du resultat</param> /// <returns></returns> public List<De> Adjacents(List<De> Tirage, List<De> excepetions) { return (from De d in Tirage where (d != this && Math.Abs(d.X - X) < 2 && Math.Abs(d.Y - Y) < 2) select d ).Except(excepetions).ToList<De>(); } public override string ToString() { //return X.ToString() + " " + Y.ToString(); return FaceVisible; } }
Publié par Whismeril. Dernière mise à jour le par Whismeril.
Ce document intitulé « Exemple de méthode récursive: la résolution d'une grille de Boogle » issu de CodeS-SourceS (https://codes-sources.commentcamarche.net/) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Actualités, Avis de décès, Carte de voeux, Bricolage, Coloriages, Cinéma, Coiffure, Cuisine, Déco, Dictionnaire, Horoscope, Jeux en ligne, Programme TV, Recettes, Restaurant, SMIC, Test débit, Voyage, Signification prénom