Colección de citas famosas - Slogan de motivación - ¿Cómo lograr una disposición completa de elementos repetidos en lenguaje C?

¿Cómo lograr una disposición completa de elementos repetidos en lenguaje C?

La idea es utilizar la idea de retroceder, que también puede considerarse como una búsqueda en profundidad.

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;

}