yo lo haría de la siguiente manera... recorres la cadena ingresada, buscando los fijos y los intercambiables, para meterlos en 2 arrays
seria algo como
si cadena[a] == cadena[a+1]+32
32 es la diferencia de posiciones ascii entre mayusculas y minusculas
cadena: 'ABcCdDEFf'
fijos: 'AB**E*'
intercambios: 'CDF' no importa las minusculas, porque se saben que son de ellos...
donde n es la cantidad de intercambios haces 2 ciclos anidados
con eso puedes hacer un juego en binario para escoger las letras correctas, aquí un ejemplo
int main() {
char intercambios[] = "ABC";
int x,y,a;
char buff[3];
for(x=0;x<8;x++){
for(y=0;y<3;y++){
a = 32*((x>>y)&1);
buff[y] = intercambios[y]+a;
}
//imprimir aqui buff para ver el resultado
}
}
la operacion ((x>>y)&1) lo que hace es lo siguiente, desplaza "x", "y" bits a la derecha, luego hace un "and" 1 para que el resultado sea 1 o 0... esta es la forma más simple de hacer combinatorias de 2 opciones ya que en binario se hacen por naturaleza
de resto, solo te falta sustituir asteriscos por el contenido de buff y estás resuelto