Eu acho que resolvi esse problema.
E para isso, modifiquei o seguinte algoritmo:
===================================
Algoritmo para obter combinações
https://social.msdn.microsoft.com/Forums/pt-BR/3ba1adbb-0093-4ba4-b92e-cc23e75bb44c/algoritmo-para-obter-combinaes?forum=clientept
===================================
Funciona assim, a função que faz a mágica acontecer é essa:
private void GeraNovaPalavra(List<string> lista, string[] array, int tamanho, string palavraAtual)
{
string palavraCorrente = palavraAtual;
for (int i = 0; i < array.Length; i++)
{
palavraCorrente += array[i];
if (palavraCorrente.Length >= tamanho)
{
lista.Add(palavraCorrente);
palavraCorrente = palavraAtual;
}
else
{
GeraNovaPalavra(lista, array, tamanho, palavraCorrente);
palavraCorrente = palavraAtual;
}
}
}
Essa função trabalha com recursividade (ela chama ela mesma).
Para testá-la, você pode criar um "form" dessa forma:
- 6 Labels;
- 2 TextBox;
- 1 NumericUpDown;
- 1 ListBox;
- 1 Button;
A tela fica assim:

O Label vazio tem o nome de "lblSeraAbertoEm";
Os TextBox se chamam: "txtSequenciaAberto" e "txtOpcoesLetras";
O NumericUpDown tem o nome de: "nudChavesSeletoras";
O ListBox se chama: "lstCadeado";
O Button se chama: "btnCalcule";
A chamada para função nesse formulário é o seguinte código (dentro do botão):
private void btnCalcule_Click(object sender, EventArgs e)
{
List<string> lstStrLetras = new List<string>();
string[] arrStrSequenciaAberto;
string[] arrStrOpcoesLetras;
string strSequenciaAberto = string.Empty;
int intTamanhoSequenciaAberto;
arrStrSequenciaAberto = txtSequenciaAberto.Text.Split();
arrStrOpcoesLetras = txtOpcoesLetras.Text.Split();
foreach (string str in arrStrSequenciaAberto)
strSequenciaAberto = strSequenciaAberto + str;
intTamanhoSequenciaAberto = (int)nudChavesSeletoras.Value;
GeraNovaPalavra(lstStrLetras, arrStrOpcoesLetras, intTamanhoSequenciaAberto, string.Empty);
lstCadeado.Items.Clear();
foreach (string letra in lstStrLetras)
{
lstCadeado.Items.Add(string.Format("{0}", letra));
if (letra == strSequenciaAberto)
{
lstCadeado.SetSelected(lstCadeado.Items.Count-1, true);
lblSeraAbertoEm.Text = letra;
}
}
}
Testa o código e qualquer dúvida me chama...
... se você gostar, pode me fazer dois favores?
1º) Me pontua aqui na MSDN;
2º) Me pontua lá no StackOverFlow Brasil? Eu não tenho nenhum ponto lá... snif, snif... Mas você precisa editar sua pergunta, pois foi bloqueada lá... "marcada como pendente como fora de escopo por NoobSaibot, Maniero♦ 12 horas atrás"
https://pt.stackoverflow.com/questions/347169/problema-com-c%C3%B3digo-de-um-cadeado
Posso também te passar o código completo via "OneDrive"... se você me oferecer uma... MEDALHA, MEDALHA, MEDALHA!!! (Muttley)
VALEW!
[]'s,
Fabio.