Je reviens vers toi même si tu as mis le sujet en résolu.
tu cherchais à optimiser le temps de recherche, me suis un peu plus penché sur le sujet, en gardant mon idée de travailler sur des array de int plutot que manipuler les string.
J'ai donc utiliser ton dico, ta grille de base basé sur "anticonstitutionnellement", de 5x5,
je te met le script, pas eu le temps de l'annoté mais pour faire bref, temps total de 0,5s pour lire le dico, convertir en array de array de int, et faire le recherche des mots basé sur les 8 directions, donnant un total de 944 mots trouvé dans le dico.
seul serait a rajouter une condition car trouve plusieurs fois le même mot parfois.
le recherche seule, en appuyant sur "r" se fait en 0.15s, en sortant la liste des mots.
Code : Tout sélectionner
using System;
using System.Collections.Generic;
using UnityEngine;
using System.Text;
using System.IO;
public class TestMots : MonoBehaviour
{
private string DICOpath = "C:/Users/djuli/Documents/dico.txt";
private string[] Dictionnaire;
private int[][] DicoNumérique;
private int[] MotsFinal;
private int MotsFinalCount;
private int TailleGrille = 5;
private int[] grille;
private int[] dir;
void Start ()
{
float tp = Time.realtimeSinceStartup;
InitialiseGrille ();
InitialiseDico ();
PrintGrille ();
RechercheMot ();
tp = Time.realtimeSinceStartup - tp;
print ( tp);
}
void Update ()
{
if (Input.GetKeyDown ("r")) {
float tp = Time.realtimeSinceStartup;
RechercheMot ();
tp = Time.realtimeSinceStartup - tp;
print (tp);
// print les motes trouvés
for (int i = 0; i < MotsFinalCount; i++) {
print (Dictionnaire [MotsFinal [i]]);
}
}
}
void InitialiseGrille ()
{
grille = new int[TailleGrille * TailleGrille];
char[] A = "ANTICONSTITUTIONNELLEMENT".ToCharArray ();
for (int i = 0; i < TailleGrille; i++) {
for (int j = 0; j < (TailleGrille + 1) / 2; j++) {
grille [i + 2 * j * TailleGrille] = char.ToUpper (A [i + 2 * j * TailleGrille]) - 64;
}
}
for (int i = 0; i < TailleGrille; i++) {
for (int j = 0; j < TailleGrille / 2; j++) {
grille [(j + 1) * 2 * TailleGrille - 1 - i] = char.ToUpper (A [(2 * j + 1) * TailleGrille + i]) - 64;
}
}
dir = new int[8] {
1,
1 + TailleGrille,
TailleGrille,
TailleGrille - 1,
-1,
-1 - TailleGrille,
-TailleGrille,
1 - TailleGrille
};
}
void InitialiseDico ()
{
if (File.Exists (DICOpath) == true) {
StreamReader dico = File.OpenText (DICOpath);
Dictionnaire = dico.ReadToEnd ().Split ("\n" [0]);
Debug.LogError ("Dictionnaire trouvé :" + Dictionnaire.Length + " mots");
} else {
Debug.LogError ("Attention dictionnaire non trouvé");
return;
}
DicoNumérique = new int[Dictionnaire.Length][];
for (int i = 0; i < Dictionnaire.Length; i++) {
DicoNumérique [i] = new int[Dictionnaire [i].Length - 1];
for (int j = 0; j < Dictionnaire [i].Length - 1; j++) {
DicoNumérique [i] [j] = char.ToUpper (Dictionnaire [i] [j]) - 64;
}
}
}
void PrintGrille ()
{
char[] alphabet = "abcdefghijklmnopqrstuvwxyzé".ToCharArray ();
for (int i = 0; i < TailleGrille; i++) {
string ligne = "";
for (int j = 0; j < TailleGrille; j++) {
ligne += char.ToUpper (alphabet [grille [i * TailleGrille + j] - 1]).ToString () + " ";
}
print (ligne);
}
}
void RechercheMot ()
{
MotsFinal = new int[10];
MotsFinalCount = 0;
int[] MotsBase = new int[DicoNumérique.Length];
for (int i = 0; i < MotsBase.Length; i++) {
MotsBase [i] = i;
}
for (int i = 0; i < grille.Length; i++) {
MotAvecLettre (0, i, MotsBase);
}
}
void MotAvecLettre (int pos, int Case, int[] mots)
{
int MotsTrouvésCount = 0;
int[] MotsTrouvés = new int[mots.Length];
int lettre = grille [Case];
for (int i = 0; i < mots.Length; i++) {
if (DicoNumérique [mots [i]].Length > pos && DicoNumérique [mots [i]] [pos] == lettre) {
MotsTrouvés [MotsTrouvésCount] = mots [i];
MotsTrouvésCount++;
}
if (DicoNumérique [mots [i]].Length == pos + 1 && DicoNumérique [mots [i]] [pos] == lettre) {
MotsFinal [MotsFinalCount] = mots [i];
MotsFinalCount += 1;
if (MotsFinal.Length == MotsFinalCount) {
Array.Resize (ref MotsFinal, MotsFinalCount + 10);
}
}
}
Array.Resize (ref MotsTrouvés, MotsTrouvésCount);
if (MotsTrouvésCount > 0) {
for (int i = 0; i < dir.Length; i++) {
int CaseSuivante = Case + dir [i];
int colonne = (Case) % TailleGrille + dir [i] % TailleGrille;
int ligne = (CaseSuivante) / TailleGrille;
if ( ligne >= 0 && ligne < TailleGrille && colonne >= 0 && colonne < TailleGrille && CaseSuivante >= 0 && CaseSuivante < TailleGrille * TailleGrille) {
MotAvecLettre (pos + 1, CaseSuivante, MotsTrouvés);
}
}
}
}
}
Voilà je te laisse potasser si tu veux, et si t'as des questions de fonctionnement, j'aurai plus de temps demain pour y répondre.
allez bonne nuit ^^