74 lines
2.2 KiB
C#
74 lines
2.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Program
|
|
{
|
|
class PermutationGenerator
|
|
{
|
|
public Dictionary<string, List<int[]>> GroupedPermutations { get; private set; }
|
|
private HashSet<string> uniquePermutations;
|
|
|
|
public PermutationGenerator()
|
|
{
|
|
GroupedPermutations = new Dictionary<string, List<int[]>>();
|
|
uniquePermutations = new HashSet<string>();
|
|
}
|
|
|
|
public void GeneratePermutations(int[] digits, int length)
|
|
{
|
|
GeneratePermutations(digits, new int[length], 0);
|
|
}
|
|
|
|
private void GeneratePermutations(int[] digits, int[] current, int index)
|
|
{
|
|
if (index == current.Length)
|
|
{
|
|
if (current[0] != 0) // Avoid permutations starting with 0
|
|
{
|
|
AddPermutation(current);
|
|
}
|
|
return;
|
|
}
|
|
|
|
for (int i = 0; i < digits.Length; i++)
|
|
{
|
|
current[index] = digits[i];
|
|
GeneratePermutations(digits, current, index + 1);
|
|
}
|
|
}
|
|
|
|
private void AddPermutation(int[] permutation)
|
|
{
|
|
var key = string.Concat(permutation.OrderBy(x => x));
|
|
var permutationString = string.Join("", permutation);
|
|
|
|
if (!uniquePermutations.Contains(permutationString))
|
|
{
|
|
uniquePermutations.Add(permutationString);
|
|
|
|
if (!GroupedPermutations.ContainsKey(key))
|
|
{
|
|
GroupedPermutations[key] = new List<int[]>();
|
|
}
|
|
GroupedPermutations[key].Add((int[])permutation.Clone());
|
|
}
|
|
}
|
|
|
|
public void PrintGroupedPermutations()
|
|
{
|
|
foreach (var group in GroupedPermutations)
|
|
{
|
|
Console.WriteLine($"Group: {group.Key}");
|
|
foreach (var permutation in group.Value)
|
|
{
|
|
Console.WriteLine(string.Join("", permutation));
|
|
}
|
|
Console.WriteLine();
|
|
}
|
|
}
|
|
}
|
|
}
|