Les Snippets

Connexion

Enumérer les arrangements possibles d'un tableau

Niveau requis pour utiliser/comprendre cette source : 1 ( Débutant )
Créé le 07/04/2010 18:34:37 et initié par Charles Racaud [Liste]
Vue : 7173
Catégorie(s) : Maths, Algorithme
Langages dispo pour ce code :
- C# 1.x, C# 2.x, C# 3.x
- VB6, VBA
- VB 2005, VB 2008



Langage : C# 1.x , C# 2.x , C# 3.x
Date ajout : 07/04/2010
Posté par Charles Racaud [Liste]
/// <summary>Représente la méthode qui est appelé lorsqu'une permutation est trouvée</summary>
/// <typeparam name="T">Type des éléments</typeparam>
/// <param name="values">Tableau contenant les éléments</param>
public delegate void PermutationHappenHandler<T>(T[] values);

/// <summary>Énumère les arrangements possibles d’un tableau</summary>
/// <typeparam name="T">Type des éléments</typeparam>
/// <param name="values">Tableau contenant les éléments</param>
/// <param name="permutationHappen">Délégué appelé à chaque permutation trouvé</param>
public static void Permutation<T>(T[] values, PermutationHappenHandler<T> permutationHappen) {
  if (values == null)
    throw new ArgumentNullException("values");
  PermutationRec<T>(values, 0, values.GetUpperBound(0), permutationHappen);
}

/// <summary>Énumère les arrangements possibles d’un tableau</summary>
/// <typeparam name="T">Type des éléments</typeparam>
/// <param name="values">Tableau contenant les éléments</param>
/// <param name="start">Index de l'élément de départ</param>
/// <param name="permutationHappen">Délégué appelé à chaque permutation trouvé</param>
public static void Permutation<T>(T[] values, int start, PermutationHappenHandler<T> permutationHappen) {
  if (values == null)
    throw new ArgumentNullException("values");
  if (start < values.GetLowerBound(0) || start > values.GetUpperBound(0))
    throw new ArgumentOutOfRangeException("start");
  PermutationRec<T>(values, start, values.GetUpperBound(0), permutationHappen);
}

/// <summary>Énumère les arrangements possibles d’un tableau</summary>
/// <typeparam name="T">Type des éléments</typeparam>
/// <param name="values">Tableau contenant les éléments</param>
/// <param name="start">Index de l'élément de départ</param>
/// <param name="length">Nombre d'éléments à prendre en compte</param>
/// <param name="permutationHappen">Délégué appelé à chaque permutation trouvé</param>
public static void Permutation<T>(T[] values, int start, int length, PermutationHappenHandler<T> permutationHappen) {
  if (values == null)
    throw new ArgumentNullException("values");
  if (start < values.GetLowerBound(0) || start > values.GetUpperBound(0))
    throw new ArgumentOutOfRangeException("start");
  if (length < 1 || length > values.Length - start)
    throw new ArgumentOutOfRangeException("length");
  PermutationRec<T>(values, start, start + length - 1, permutationHappen);
}

private static void PermutationRec<T>(T[] values, int startpos, int endpos, PermutationHappenHandler<T> permutationHappen) {
  T tmp;
  if (permutationHappen != null)
    permutationHappen(values);
  for (int i = startpos; i <= endpos; i++) {
    for (int j = i + 1; j <= endpos; j++) {
      tmp = values[i];
      values[i] = values[j];
      values[j] = tmp;
      PermutationRec(values, i + 1, endpos, permutationHappen);
      values[j] = values[i];
      values[i] = tmp;
    }
  }
}


// Exemple d'utilisation

static void Main(string[] args) {

  Permutation<int>(new int[] { 1, 2, 3, }, new PermutationHappenHandler<int>(PermutationHappen<int>));
  // Sortie :
  // 123
  // 213
  // 231
  // 321
  // 312
  // 132

  Permutation<char>(new char[] { '[', 'a', 'b', 'c', ']', }, 1, 3, new PermutationHappenHandler<char>(PermutationHappen<char>));
  // Sortie :
  // [abc]
  // [bac]
  // [bca]
  // [cba]
  // [cab]
  // [acb]

}

static void PermutationHappen<T>(T[] values) {
  for (int i = 0; i < values.Length; i++)
    Console.Write(values[i].ToString());
  Console.WriteLine();
}
Langage : VB6 , VBA
Date ajout : 07/04/2010
Posté par Charles Racaud [Liste]
' Enumére les arrangements possibles d'un tableau
'  values: Tableau contenant les éléments
Public Sub Permutation(ByRef values() As Integer)
  Call PermutationRec(values, 0UBound(values))
End Sub

' Enumére les arrangements possibles d'un tableau
'  values: Tableau contenant les éléments
'  start: Index de l'élément de départ
Public Sub PermutationS(ByRef values() As IntegerByVal start As Long)
  If start < LBound(values) Or start > UBound(values) Then
    Err.Raise 9
  Else
    Call PermutationRec(values, start, UBound(values))
  End If
End Sub

' Enumére les arrangements possibles d'un tableau
'  values: Tableau contenant les éléments
'  start: Index de l'élément de départ
'  length: Nombre d'éléments à prendre en compte
Public Sub PermutationSL(ByRef values() As IntegerByVal start As LongByVal length As Long)
  If start < LBound(values) Or start > UBound(values) Then
    Err.Raise 9
  ElseIf length < 1 Or length > UBound(values) - start + 1 Then
    Err.Raise 9
  Else
    Call PermutationRec(values, start, start + length - 1)
  End If
End Sub

Private Sub PermutationRec(ByRef values() As IntegerByVal startpos As LongByVal endpos As Long)
  Dim i As Long, j As Long
  Dim tmp As Variant

  ' ToDo: Arrivée d'une permutation possible, ajoutez les instruction ici

  For i = startpos To endpos
    For j = i + 1 To endpos
      tmp = values(i)
      values(i) = values(j)
      values(j) = tmp
      Call PermutationRec(values, i + 1, endpos)
      values(j) = values(i)
      values(i) = tmp
  Next j, i
End Sub

Langage : VB 2005 , VB 2008
Date ajout : 07/04/2010
Posté par Charles Racaud [Liste]
''' <summary>Représente la méthode qui est appelé lorsqu'une permutation est trouvée</summary>
''' <typeparam name="T">Type des éléments</typeparam>
''' <param name="values">Tableau contenant les éléments</param>
Public Delegate Sub PermutationHappenHandler(Of T)(ByVal values() As T)

''' <summary>Énumère les arrangements possibles d’un tableau</summary>
''' <typeparam name="T">Type des éléments</typeparam>
''' <param name="values">Tableau contenant les éléments</param>
''' <param name="permutationHappen">Délégué appelé à chaque permutation trouvé</param>
Public Sub Permutation(Of T)(ByVal values() As T, ByVal permutationHappen As PermutationHappenHandler(Of T))
  If values Is Nothing Then Throw New ArgumentNullException("values")
  PermutationRec(Of T)(values, 0, values.GetUpperBound(0), permutationHappen)
End Sub

''' <summary>Énumère les arrangements possibles d’un tableau</summary>
''' <typeparam name="T">Type des éléments</typeparam>
''' <param name="values">Tableau contenant les éléments</param>
''' <param name="start">Index de l'élément de départ</param>
''' <param name="permutationHappen">Délégué appelé à chaque permutation trouvé</param>
Public Sub Permutation(Of T)(ByVal values() As T, ByVal start As IntegerByVal permutationHappen As PermutationHappenHandler(Of T))
  If values Is Nothing Then Throw New ArgumentNullException("values")
  If start < values.GetLowerBound(0OrElse start > values.GetUpperBound(0Then Throw New ArgumentOutOfRangeException("start")
  PermutationRec(Of T)(values, start, values.GetUpperBound(0), permutationHappen)
End Sub

''' <summary>Énumère les arrangements possibles d’un tableau</summary>
''' <typeparam name="T">Type des éléments</typeparam>
''' <param name="values">Tableau contenant les éléments</param>
''' <param name="start">Index de l'élément de départ</param>
''' <param name="length">Nombre d'éléments à prendre en compte</param>
''' <param name="permutationHappen">Délégué appelé à chaque permutation trouvé</param>
Public Sub Permutation(Of T)(ByVal values() As T, ByVal start As IntegerByVal length As IntegerByVal permutationHappen As PermutationHappenHandler(Of T))
  If values Is Nothing Then Throw New ArgumentNullException("values")
  If start < values.GetLowerBound(0OrElse start > values.GetUpperBound(0Then Throw New ArgumentOutOfRangeException("start")
  If length < 1 OrElse length > values.Length - start Then Throw New ArgumentOutOfRangeException("length")
  PermutationRec(Of T)(values, start, start + length - 1, permutationHappen)
End Sub

Private Sub PermutationRec(Of T)(ByVal values() As T, ByVal startpos As IntegerByVal endpos As IntegerByVal permutationHappen As PermutationHappenHandler(Of T))
  Dim tmp As T
  If (permutationHappen IsNot NothingThen permutationHappen(values)
  For i As Integer = startpos To endpos
    For j As Integer = i + 1 To endpos
      tmp = values(i)
      values(i) = values(j)
      values(j) = tmp
      PermutationRec(values, i + 1, endpos, permutationHappen)
      values(j) = values(i)
      values(i) = tmp
  Next j, i
End Sub


Snippets en rapport avec : Permutation, Arrangements



Codes sources en rapport avec : Permutation, Arrangements

{C# / C#.NET} COMBINAISONS DE CARACTÈRES
Suite à une question sur le forum, voici ma solution pour trouver tous les arrangement de longueur f...

{Flash} AS3 - JEU DU TAQUIN
Jeu bien connu et très prise de tête, il n'est pas simple à résoudre une fois mélangé. Cette sour...

{JAVA / J2EE} CRYPTAGE PAR DES
Ce programme a été créé dans le but de faire des tests de cryptage par DES..... La classe est riche...

{JAVA / J2EE} GENERATEUR DE MOT PAR INCREMENTATION
Cette class permet de renvoyer un mot à partir d'un autre avec une permutation du dernier caractère ...

{Visual Basic, VB6, VB.NET, VB 2005} ANAGRAMMES
C'est vrai, il y a déjà des sources avec des anagrammes... Mais (pour celles que j'ai regardées...)...

{Delphi} PETITE COMBIN TURBO
Modif de la source de Cantador http://www.delphifr.com/code.aspx?ID=47493 Sortie de l'allocation ...

{PHP} TROUVER TOUS LES ANAGRAMMES D'UN MOT
Bonjour à tous. Ce code permet de lister tous les anagrammes d'un mot. C'est vraiment un code pour ...

{Visual Basic, VB6, VB.NET, VB 2005} CODE ADFGVX
cette source permet de crypter un texte en utilisant le cryptage adfgvx(enfin une variante)qui utili...

{C / C++ / C++.NET} GÉNÉRATION D'UNE PERMUTATION ALÉATOIRE, SANS RETIRAGE
C'est un petit algorithme qui permet de distribuer aléatoirement les nombres de 1 à 10 dans un table...

{JAVA / J2EE} COMBINATOIRE : COMBINAISONS SIMPLES ET PERMUTATIONS SIMPLES.
Le code est commenté... Des améliorations restent à apporter......