Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: anonimo12121 en 8 Octubre 2012, 01:16 am



Título: [C++]Estructura matricial, tipo(conjunto)
Publicado por: anonimo12121 en 8 Octubre 2012, 01:16 am
Aquí pongo un código que estoy haciendo por si a alguien le hiciera falta.

Sirve para representar grafos y en el ejemplo lo combino con un pequeño mapa de 7x7 con colisión por así decirlo.
Código
  1. #include <iostream>
  2. using namespace std;
  3. ///////////////////////////////////////////////
  4. ///////////////////////////////////////////////
  5. class Map2D {// Esta clase es para generar una matrix de 2dimensiones
  6.    public://sirvepara crear un mapa con cordenadas 'x' e 'y'
  7.        Map2D(int,int);
  8.        bool mMap[100][100];//bool es para que solo tome 2 valores posibles true'1' y false'0' en el mapa false es colisión y true es libre
  9.        void Print();// esto para imprimir el mapa
  10.        void Add(int,int);// esto lo he echo para añadir una colisión
  11.        int mSizeX;//esto es el tamaño del ancho del mapa, pueden tomar como valor máximo 100 por el tamaño de la matrix mMap...
  12.        int mSizeY;//esto es el tamaño del alto del mapa, pueden tomar como valor máximo 100 por el tamaño de la matrix mMap...
  13. };
  14. Map2D::Map2D(int _x,int _y){
  15.    mSizeX=_x;
  16.    mSizeY=_y;
  17.    for(int y=0;y<_y;y++){
  18.        for(int x=0;x<_x;x++){
  19.            mMap[y][x]=false;//el mapa se crea vacio.
  20.        }
  21.    }
  22. }
  23. void Map2D::Print(){//esto nada más es para imprimir el mapa
  24.    for(int y=0;y<mSizeY;y++){
  25.        for(int x=0;x<mSizeX;x++){
  26.            cout << mMap[y][x];
  27.        }
  28.        cout << endl;
  29.    }
  30.    cout << endl;
  31. }
  32. void Map2D::Add(int x,int y){// Esto es para añadir una colisión un tontería puesto que los miembros son publicos en la clase
  33.    mMap[y][x]=true;//nada más lo hice para ahorrar trabajo, puesto con poner (Map2D::Add(x,y) 'x' e 'y' son cordenadas.) añade colision
  34. }
  35.  
  36. ///////////////////////////////////////////////
  37. ///////////////////////////////////////////////
  38. class StructMatricial {// Esta clase es para crear una estructura matricial de tipo conjunto, sirve para trabajar con grafos
  39.    public:
  40.        StructMatricial();
  41.        bool Load(Map2D);
  42.        int mVertices[100];//vertices que tiene el grafo
  43.        int mAristas[100][10];//una arista es el camino que une un vertice con otro. por ejemplo si el vertice '1' tiene una arista que conecta con el vertice '2' sería así mAristas[1][0]=2
  44.        int mNumerosAristas[100];//Para saber el numero de aristas que tiene cada vertice, "caminos hacia otros vertices"
  45.        bool mIsVertice[100];//esta es una matriz complementaría para saber si el vertice es transitable o no, si no es colision ese punto entonces es transitable
  46. };
  47.  
  48. StructMatricial::StructMatricial(){
  49. }
  50.  
  51. bool StructMatricial::Load(Map2D m){
  52.    int iv=0;//iterador vertices
  53.    int ia=0;//iterador aristas
  54.    //Primero Creamos todos los vertices
  55.    for(int y=0;y<m.mSizeY;y++){
  56.        for(int x=0;x<m.mSizeX;x++){
  57.            mVertices[iv]=iv;//
  58.            if(m.mMap[y][x]==false){//Si la posicion no es colision
  59.                mIsVertice[iv]=false;//la posicon es un vertice transitable
  60.            }
  61.            else mIsVertice[iv]=true;//Si no, no lo es
  62.            // incremento del iterador
  63.            iv++;
  64.  
  65.        }
  66.    }
  67.    iv=0;
  68.    for(int y=0;y<m.mSizeY;y++){
  69.        for(int x=0;x<m.mSizeX;x++){
  70.            if(m.mMap[y][x]==false){
  71.                if(m.mMap[y][x-1]==false && x>0){// si izquierda no es colision .. el x>0 es para que no se salga de memoria la operación
  72.                    mAristas[iv][ia]=mVertices[((y*m.mSizeX)+x-1)];// entoncens el vertice tiene una arista hacia el vertice de la izquierda
  73.                    ia++;
  74.                }
  75.                if(m.mMap[y][x+1]==false && x<m.mSizeX){
  76.                    mAristas[iv][ia]=mVertices[(y*m.mSizeX)+x+1];
  77.                    ia++;
  78.                }
  79.                if(m.mMap[y-1][x]==false && y>0){
  80.                    mAristas[iv][ia]=mVertices[((y-1)*m.mSizeX)+x];
  81.                    ia++;
  82.                }
  83.                if(m.mMap[y+1][x]==false && y<m.mSizeY){
  84.                    mAristas[iv][ia]=mVertices[((y+1)*m.mSizeX)+x];
  85.                    ia++;
  86.                }
  87.            }
  88.            // incremento del iterador
  89.            mNumerosAristas[iv]=ia;
  90.            iv++;
  91.            ia=0;
  92.  
  93.        }
  94.    }
  95.    return false;
  96. };
  97. ///////////////////////////////////////////////
  98. ///////////////////////////////////////////////
  99.  
  100.  
  101. ///////////////////////////////////////////////
  102. ///////////////////////////////////////////////
  103. int main(int argc,char* argv[]){
  104.    ///////////////////////////////////////////
  105.    // Creación del mapa
  106.    Map2D map(7,7);
  107.    map.Add(3,2);
  108.    map.Add(4,1);
  109.    map.Add(2,3);
  110.    map.Add(4,3);
  111.    for(int i=0;i<7;i++)map.Add(i,0);
  112.    for(int i=0;i<7;i++)map.Add(i,6);
  113.    for(int i=0;i<7;i++)map.Add(0,i);
  114.    for(int i=0;i<7;i++)map.Add(6,i);
  115.    map.Print();
  116.    ///////////////////////////////////////////
  117.    // Creación de la estructura matricial conjunto
  118.    StructMatricial SM;// Trollface con el nombre
  119.    SM.Load(map);
  120.    ///////////////////////////////////////////
  121.    ///////////////////////////////////////////
  122.    cout << "vertice: "<< SM.mVertices[24]<< endl;
  123.    cout << "Aristas: ";
  124.    for(int i=0;i<SM.mNumerosAristas[24];i++)cout << SM.mAristas[24][i] << "-" ;
  125.    cout << endl;
  126.    cout << "Game Over" << endl;
  127.    return 0;
  128. }


Título: Re: [C++]Estructura matricial, tipo(conjunto)
Publicado por: dato000 en 8 Octubre 2012, 02:39 am
Pues, dejame decirte que muy buen esfuerzo, pero no se entiende lo que haces, podrias explicar un poco de que se trata?

Entiendo que generas una matriz 7x7, y la generas llenandola con "0" y vas cambiando determinados puntos. Pero, veo que usas clases, todavia no he llegado a ese apartado en C++, como se trabaja??

Buen código, pero a la hora de cargarlo sale esto:

Citar
1111111
1000101
1001001
1010101
1000001
1000001
1111111

vertice: 8
Aristas: 9-15-
Game Over

Process returned 0 (0x0)   execution time : 0.013 s
Press any key to continue.

Lo saque en codeblocks, pero no se que quieres decir ni con vertice ni con aristas.
Muy confuso lo que tratas de hacer, me gustaria mucho que explicaras como trabaja cada función y las clases, si no es mucho pedir, aparte de eso, es un trabajo genial colega!



Título: Re: [C++]Estructura matricial, tipo(conjunto)
Publicado por: anonimo12121 en 8 Octubre 2012, 12:23 pm
Soy malo explicando pero he modificado el código añadiendo comentarios, Este código puede servir para hacer el código de el camino más corto, quizás haya otras formas no lo sé, sobre las clases pues la uso para dividir el trabajo en plan, esto pertenece a esto y esto otro a esto. esta semilla es de manzana y esta otra semilla de pera, jeje.

y sobre lo que se imprime es lo siguiente.
el mapa, 1 colisión y 0 no colisión, imagina un mapa de ciudad y tienes que trazar el camino más corto hasta el cine, no vale hacer una linea recta por que hay edificios en medio, pues entonces ponemos un 1.
donde pone vértice es el vértice que quiero examinar y donde aristas son las aristas que tiene el vértice que comunica con otros vértices, osea el 9 y el 15 que te salió son otros vértices, la arista almacena el vértice al que conecta. Espero haber explicado lo mejor posible esto.
Cualquier cosa avisa.

Si quieres información sobre la grafos visita este link. http://es.wikipedia.org/wiki/Teor%C3%ADa_de_grafos