La restricción es fea.
Probablemente la mejor manera de resolver esto usando solo lápiz y papel es aplicando el principio de inclusión y exclusión: cuente todas las permutaciones, reste aquellas en las que hay un bloque de tres letras consecutivas, agregue aquellas en las que hay dos de esos bloques y lo mismo con tres y con los cuatro bloques.
El número total de permutaciones es (12!) / (3!) ^ 4 = 369,600.
Si arreglamos un grupo de tres letras consecutivas, tenemos:
- Cómo encontrar el área de MATEMÁTICAS cuadriláteros, con los vértices M (4,5), A (9,7), T (11,2) y H (2,1)
- Usando cualquier símbolo o signo matemático, ¿puedes probar que 0 + 0 + 0 = 6?
- ¿Qué es integral tan x / (1 + m ^ 2 tan ^ 2 x) dx de 0 a pi / 2?
- Cómo aprender un tema difícil (ej .: álgebra lineal) rápidamente (unas pocas semanas)
- ¿Cómo es y = sqrt xa función, pero y ^ 2 = x no es una función, incluso es igual entre sí?
- 4 formas de elegir qué letra es
- 10 objetos para permutar: 3 grupos de 3 letras individuales y 1 grupo de tres letras
Teniendo en cuenta las simetrías, esto nos da 4 * (10!) / (3!) ^ 3 = 67,200 permutaciones para restar.
De manera similar, luego sumamos 6 * (8!) / (3!) ^ 2 = 6720 permutaciones que restamos dos veces en el paso anterior, luego restamos 4 * (6!) / (3!) = 480 permutaciones en las que tenemos tres bloques consecutivos, y finalmente agregamos (4!) = 24 permutaciones en las que las cuatro letras forman bloques consecutivos.
Esto nos da un gran total de 369600 – 67200 + 6720 – 480 + 24 = 308,664 permutaciones.
Afortunadamente para nosotros, el tamaño de este problema es lo suficientemente pequeño, por lo que podemos verificar nuestro resultado utilizando la fuerza bruta. Un posible programa está abajo.
#include
#include
#include
bool good (const std :: cadena y letras) {
for (unsigned i = 0; i + 2 <letters.size (); ++ i)
if (letras [i] == letras [i + 1])
if (letras [i + 1] == letras [i + 2])
falso retorno;
volver verdadero;
}
int main () {
std :: string letters = “aaabbbcccddd”;
respuesta larga larga = 0;
hacer {
respuesta + = int (bueno (letras));
} while (std :: next_permutation (letters.begin (), letters.end ()));
std :: cout << respuesta << "\ n";
}