Вы можете сгенерировать каждую перестановку, увеличив счетчик и преобразовав значение счетчика в основание n, где n - количество букв в вашем входе.Откажитесь от любых значений, содержащих повторяющиеся буквы, и то, что вы оставили, это возможные слова скрэббл в алфавитном порядке, при условии, что ваш массив был отсортирован.
Вам нужно будет сосчитать до (n ^ (n-1)) * (n+1) чтобы получить е * п!возможные слова скрэббл.
char[] Letters = new char[] { 'A', 'B', 'C', 'D', 'E', 'F' };
// calculate e*n! (int)Math.Floor(Math.E * Math.Factorial(Letters.Length))
int x = 0;
for (int i = 1; i <= Letters.Length; i++)
x = (x + 1) * i;
for (int i = 1; x > 0; i++)
{
string Word = BaseX(i, Letters.Length, Letters);
if (NoRepeat(Word))
{
Console.WriteLine(Word);
x--;
}
}
BaseX возвращает строковое представление значения для данной базы и указанных символов:
string BaseX(int Value, int Base, char[] Symbols)
{
StringBuilder s = new StringBuilder();
while (Value > Base)
{
s.Insert(0, Symbols[Value % Base]);
Value /= Base;
}
s.Insert(0, Symbols[Value - 1]);
return s.ToString();
}
NoRepeat возвращает false, если любая буква встречается более одного раза:
bool NoRepeat(string s)
{
bool[] Test = new bool[256];
foreach (char c in s)
if (Test[(byte)c])
return false;
else
Test[(byte)c] = true;
return true;
}