/*
*
*
* Generador de diccionario. Genera todas las combinaciones.
* El resultado se deja en un fichero llamado mierda.txt
* En cada ejecución se machaca el fichero.
*
* Diseñado y programado por Khronos.
*
* !Atención¡ Un número elevado para la longitud de las palabras del diccionario
* puede agotar la memoria de nuestro PC[problema resuelto]. Este programa se puede usar para crear
* otro diccionario con qualquier longitud de palabras.
*
* Se aceptan quejas, sugerencias, felicitaciones, ...
* E-mail:
[email protected]
*
*
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
unsigned char base[37]="0123456789abcdefghijklmnopqrstuvwxyz";
int car_base= 37,naux;
int lpass,bloque;
FILE * dicc;
int * aux;
void limpiar(int elem[],int desde, int hasta)
{
short int i;
for(i=desde;i<=hasta;i++) elem[i]=-1;
}
void escribir(int elem[])
{
char pwd[20];
short int i;
for (i=0;i<lpass;i++)
{
pwd[i]=base[elem[i]];
}
pwd[lpass]='\n';
pwd[lpass+1]='\0';
printf("%s", pwd);
fputs(pwd,dicc);
}
void siguiente(int elem[],int nivel)
{
int backtraking(int[],int);
int i = nivel - 1;
int j;
while ((i>=0) && (elem[i]==35)) i--;
if (i>=0)
{
limpiar(elem,i+1,15);
elem[i]=elem[i]+1;
backtraking(elem,i+1);
}
else
{
fclose(dicc);
exit(1);
}
}
void prolongar(int elem[],int nivel)
{
int backtraking(int[],int);
elem[nivel]=0;
backtraking(elem,nivel+1);
}
int backtraking(int elem[],int nivel)
{
if (nivel == lpass) /* combinación terminada (exito) */
{
escribir(elem);
bloque ++;
/* pasar al siguiente */
if (bloque<1000) {siguiente(elem, nivel);}
else {aux = elem;
bloque=0;
naux = nivel;}
}
else
{
/* prolongar */
prolongar(elem,nivel);
}
}
main ()
{
int elemento[15];
bloque=0;
printf ("Numero de caracteres a generar: ");
scanf ("%d", &lpass);
limpiar(elemento,0,15);
dicc = fopen("mierda.txt","w");
backtraking(elemento, 0);
while (1)
{
siguiente(aux,naux);
}
}