1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
// list = ton tableau d'origine
// action = la continuation (en c++ implémenter sous forme d'un pointeur sur fonction ou passer un objet portant une méthode définie pour traiter les résultats
public static void Arrangement<T>( List<T> list, Action<IEnumerable<T>> action )
{
// Initialisation d'un tableau de flag (false = non encore utilisé, true = déjà utilisé)
// Ici, à l'allocation, tout est false par défaut
bool[] flags = new bool[list.Count];
// Le tableau qui va contenir le résult (il fait la taille du tableau d'origine)
T[] result = new T[list.Count];
// Appel de la fonction récursive avec tout ça et au niveau 0
Arrangement( list, flags, result, 0, action );
}
static void Arrangement<T>( List<T> list, bool[] flags, T[] result, int level, Action<IEnumerable<T>> action )
{
// Si le niveau = taille du tableau, alors on a fini
if ( level == list.Count )
{
action( result );
}
else
{
// Boucle sur toutes les positions
for ( int i = 0 ; i < list.Count ; i++ )
{
// Si pas déjà utilisé
if ( flags[i] == false )
{
// Marquer comme utilisé
flags[i] = true;
// Mettre le résultat à sa position
result[level] = list[i];
// Appel récursif
Arrangement( list, flags, result, level + 1, action );
// Enlever le marquage
flags[i] = false;
}
}
}
} |
Partager