[C++] Especie de Fuerza Bruta

Iniciado por PiroskY, 6 Noviembre 2010, 02:59 AM

0 Miembros y 2 Visitantes están viendo este tema.

PiroskY

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 (cpp) [Seleccionar]
#include <iostream>
#include <Time.h>
#include <cstdlib>
using namespace std;


void CargaVector(int vec[],int digitos)
{
    int z=0,error,N;
    while (vec[digitos-1] == 0)
    {
        error=1;
        while (error == 1)
        {
            error=0;
            N = (rand() % digitos) + 1;
            for (int a=0;a<z;a++)
                if (N == vec[a])
                    error=1;
            if (error == 0)
            vec[z]=N;
        }
        z++;
    }
}


int main()
{
    int N,x,y,digitos,aux,fact,error,bien=1,ban;

    cout << "Digitos: ";
    cin >> digitos;
    aux = digitos;
    fact = digitos;

    while (aux-1 > 1)
    {
        fact = fact*(aux-1);
        aux--;
    }

    int mat[fact][digitos],vec[digitos];

    for (x=0;x<fact;x++)
        for (y=0;y<digitos;y++)
            mat[x][y] = 0;

    for (x=0;x<digitos;x++)
        vec[x]=0;

    CargaVector(vec,digitos);
//
    x=0;
    for (y=0;y<digitos;y++)
        mat[x][y] = vec[y];

    CargaVector(vec,digitos);

    while (mat[fact-1][digitos-1] == 0) //mientras el ultimo elemento de la matriz siga siendo 0
    {
        x=0;
--->    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)
        {
            bien=0;
            ban=0;
            for (y=0;y<digitos;y++)
                if (mat[x][y] != vec[y] && ban == 0)
                {
                    bien++;
                    ban++;
                }
            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
            {
                CargaVector(vec,digitos);
                continue;
            }
            x++;
--->    }
       
        if (bien-1 == x)
            for (y=0;y<digitos;y++)
                mat[x][y] = vec[y];
    }

return 0;
}



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

Beakman

CitarSe 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:
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.

PiroskY

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

Beakman

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 ) 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:
int mat[fact][digitos],vec[digitos];

tenes que hacer esto:

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:
delete[] mat;

cualquier cosa pregunta.
suerte
( perdon por no contestarte antes , no pude )