elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C++] Especie de Fuerza Bruta
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C++] Especie de Fuerza Bruta  (Leído 2,100 veces)
PiroskY

Desconectado Desconectado

Mensajes: 76


пирожки


Ver Perfil
[C++] Especie de Fuerza Bruta
« en: 6 Noviembre 2010, 02:59 am »

Basicamente el programa funciona(deberia hacerlo) asi:
Se ingresa la cantidad de digitos
segun eso, se calcula el factorial para saber cuantas distintas combinaciones hay, y se crea una matriz de esas dimensiones
la matriz se inicia en 0
Se carga la primer convinacion en la matriz
mientras el primer elemento de la fila sea distinto a 0, va a ir comparando numero a numero, para ver si la combinacion es la misma
si es la misma la descarta y crea una nueva, si no es la misma acumula
si la cantidad de acumulaciones -1 es igual al indice de fila, significa que eran todas distintas, y guarda esa convinacion es esa fila
y asi hasta terminar
pero bueno, eso es lo que deberia hacer, no lo que hace :P


aca les tiro mi codigo:

Código
  1. #include <iostream>
  2. #include <Time.h>
  3. #include <cstdlib>
  4. using namespace std;
  5.  
  6.  
  7. void CargaVector(int vec[],int digitos)
  8. {
  9.    int z=0,error,N;
  10.    while (vec[digitos-1] == 0)
  11.    {
  12.        error=1;
  13.        while (error == 1)
  14.        {
  15.            error=0;
  16.            N = (rand() % digitos) + 1;
  17.            for (int a=0;a<z;a++)
  18.                if (N == vec[a])
  19.                    error=1;
  20.            if (error == 0)
  21.            vec[z]=N;
  22.        }
  23.        z++;
  24.    }
  25. }
  26.  
  27.  
  28. int main()
  29. {
  30.    int N,x,y,digitos,aux,fact,error,bien=1,ban;
  31.  
  32.    cout << "Digitos: ";
  33.    cin >> digitos;
  34.    aux = digitos;
  35.    fact = digitos;
  36.  
  37.    while (aux-1 > 1)
  38.    {
  39.        fact = fact*(aux-1);
  40.        aux--;
  41.    }
  42.  
  43.    int mat[fact][digitos],vec[digitos];
  44.  
  45.    for (x=0;x<fact;x++)
  46.        for (y=0;y<digitos;y++)
  47.            mat[x][y] = 0;
  48.  
  49.    for (x=0;x<digitos;x++)
  50.        vec[x]=0;
  51.  
  52.    CargaVector(vec,digitos);
  53. //
  54.    x=0;
  55.    for (y=0;y<digitos;y++)
  56.        mat[x][y] = vec[y];
  57.  
  58.    CargaVector(vec,digitos);
  59.  
  60.    while (mat[fact-1][digitos-1] == 0) //mientras el ultimo elemento de la matriz siga siendo 0
  61.    {
  62.        x=0;
  63. --->    while (mat[x][0] != 0) //mientras el primer elemento de la fila sea distinto de 0 (aca va a estar comparando, para no repetir combinaciones)
  64.        {
  65.            bien=0;
  66.            ban=0;
  67.            for (y=0;y<digitos;y++)
  68.                if (mat[x][y] != vec[y] && ban == 0)
  69.                {
  70.                    bien++;
  71.                    ban++;
  72.                }
  73.            if (bien == 0) //si bien sigue siendo 0 es porque hubo una combinacion coincidente, vuelvo a generar una combinacion en mi vector auxiliar y mando al final del ciclo
  74.            {
  75.                CargaVector(vec,digitos);
  76.                continue;
  77.            }
  78.            x++;
  79. --->    }
  80.  
  81.        if (bien-1 == x)
  82.            for (y=0;y<digitos;y++)
  83.                mat[x][y] = vec[y];
  84.    }
  85.  
  86. return 0;
  87. }
  88.  


Al parecer nunca llega a salir del ciclo que marque con flechitas
Una ayudilla, dato, consejo?


En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: [C++] Especie de Fuerza Bruta
« Respuesta #1 en: 13 Noviembre 2010, 04:12 am »

Citar
Se carga la primer convinacion en la matriz
mientras el primer elemento de la fila sea distinto a 0, va a ir comparando numero a numero, para ver si la combinacion es la misma
si es la misma la descarta y crea una nueva, si no es la misma acumula
si la cantidad de acumulaciones -1 es igual al indice de fila, significa que eran todas distintas, y guarda esa convinacion es esa fila
y asi hasta terminar

lo podrías explicar de otra forma?

//-------------------------------------------------------------------

Hiciste esto:
Código:
int mat[fact][digitos],vec[digitos];
Eso solo funciona en algunos IDEs, puede fallar porque no es la forma correcta de hacerlo.
Para eso esta la memoria dinamica.
 


En línea

PiroskY

Desconectado Desconectado

Mensajes: 76


пирожки


Ver Perfil
Re: [C++] Especie de Fuerza Bruta
« Respuesta #2 en: 13 Noviembre 2010, 05:16 am »

el problema es que no se de memoria dinamica aun, intento hacerlo con mis pequeños conocimientos, se que peudo ahcerlo de una u otra forma, pero no em sale :P

y lo que pedis que vuelva a explicar es asi:

Llamo a la funcion que me crea una convinacion, por ser la primera, la cargo en la matriz sin comparar contra ninguna
despues la llamo de nuevo, y voy recorriendo las filas de la matriz, viendo, si el primer elemento es algo distinto a un 0 es porque ahi ya hay una convinacion (porque previamente la inicialice toda con ceros)
si ya hay una convinacion, va a comparar contra esa, si pasa todas las comparaciones de todas las combinaciones, viendo que la convinacion que tengo actualmente en el vectorsito auxiliar es distinta a todas las guardadas, la guarda en la siguiente fila

no se si me explique mejor ahora
En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: [C++] Especie de Fuerza Bruta
« Respuesta #3 en: 20 Noviembre 2010, 06:03 am »

si ahora te entendí.
ponele un cout dentro del while y mostrá el nuevo vector que estas queriendo agregar a la matriz, ese vector siempre es el mismo, por eso no sale del ciclo.
El vector es el mismo porque te esta fallando lo que hiciste para conseguir un numero aleatorio.
intenta poner al principio del programa ( en el main )
Código:
srand( time (NULL ) );

Intenta cargar la matriz sin conseguir los números de una forma aleatoria. va a ser mejor.

la memoria dinámica no es muy complicada.
En vez de hacer esto:
Código:
int mat[fact][digitos],vec[digitos];

tenes que hacer esto:
Código:
int **mat; //puntero a puntero
mat = new int*[fact]; //nuevo vector de punteros
for(int z=0;z<fact;z++)
    mat[z] = new int[digitos]; //para cada puntero un nuevo vector
Usas la matriz de la misma forma,
y al final del programa tenes que liberar la memoria asi:
Código:
delete[] mat;

cualquier cosa pregunta.
suerte
( perdon por no contestarte antes , no pude )
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Una especie de red
Desarrollo Web
the emu 3 1,984 Último mensaje 4 Enero 2013, 18:48 pm
por Ori-chan
El usuario, esa especie en peligro
Noticias
wolfbcn 0 1,076 Último mensaje 17 Mayo 2013, 14:24 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines