¿Cómo lograr una disposición completa de elementos repetidos en lenguaje C?
A partir del primer número idx=0 de la cadena, cada vez que un carácter después de s[idx] se selecciona recursivamente y se intercambia con s[idx].
Debido a que puede haber caracteres repetidos, puedes usar una matriz hash para marcar si cada carácter en el bucle actual está seleccionado.
Debido a que el rango de caracteres no excede el código ASCII, una matriz de 128 espacios es suficiente para marcar.
Después de seleccionar el carácter actual s[i] e intercambiarlo con s[idx], la llamada recursiva continúa organizando el siguiente dígito s[idx+1].
Tenga en cuenta que aquí es necesario retroceder, es decir, cambiar el carácter seleccionado a s[idx] en lugar de s[i].
Por lo tanto, el s[i] y el s[idx] anteriores deben intercambiarse y restaurarse al estado original, para que la siguiente elección pueda juzgarse en un bucle.
Las capturas de pantalla del código específico son las siguientes:
Los resultados de ejecución son los siguientes:
Los resultados son correctos y esperamos adoptarlos~
Código fuente adjunto:
# include & ltstdio.h & gt
# include & ltstdlib.h & gt
# include & ltstring. h & gt
# define MAXN 1000000 //El número total de permutaciones puede ser grande.
int num = 0; //Registra el número total de permutaciones
char * RES[MAXN]= { NULL }; // La matriz de punteros guarda los resultados de la permutación.
Void swap(char *x, char *y) {//Intercambia el contenido de dos variables de caracteres.
char ch = * x
* x = * y
* y = ch
}
Voidperm (char * s, int n, int idx) {//El retroceso genera una matriz de cadenas completa.
If (idx == n) {//Ya dispuestos al final de la cadena.
RES[num]=(char *)malloc(sizeof(char)*(n+1));
//printf("%s\n ", s) ;//Salir del arreglo actual
strcpy(res[num], s); //Guardar el arreglo actual
num++ //Agregar 1 al número total de arreglos
Return;
}
int i, hash[128]= { 0 }; //Matriz hash, que marca si cada carácter está seleccionado.
for(I = idx;i<n;i++) {
if (hash[s[i]] == 1)
Continuar;/ /Saltar caracteres repetidos marcados.
hash[s[I]]= 1; //Si se selecciona, se marcará como 1 en la matriz.
Interchange(amps[idx], & amps[I]); //Seleccione s[i] para cambiar a s[idx]
perm(s, n, idx+ 1 ); //Continuar seleccionando recursivamente s[idx+1]
Interchange (amps[idx], & amps[I]); //Regresar, actualmente selecciona otros caracteres en lugar de s[i].
}
}
int main() {
int n, I
scanf(" %d ",& ampn);
char * s =(char *)malloc(sizeof(char)*(n+1));
scanf("%s " , s);
perm(s, n, 0);
Printf("Hay %d permutaciones en un * * *: \n "), num);/ /Generar el número total de permutaciones
for(I = 0;I<numI++) {//Generar todas las permutaciones.
printf("%s\n ",RES[I]);
Free(RES[I]); //Liberar espacio en memoria
}
Gratis;
Devuelve 0;
}