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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


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

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Creacion de matriz
« en: 7 Marzo 2018, 23:56 pm »

Hola! Soy nueva en la programación y me llego un problema. No se cuál seria la mejor manera de solucionarlo. Hice un código muy largo y no me parece que este bien aunque funcione.
El problema es el siguiente:

Tengo que crear una matriz de numeros ( 1 a 6) con un ancho X y un largo Y.
El array Z0 debe tener un 5  y el Z-1 un 6. Entonces quedaría algo asi:
XXX5XX
XXXXXX
XXXXXX
6XXXXX

La siguiente condición es que en Zx debe existir un 2 y en Zx+1 un 3.

X2X5XX
X3XX2X
XXXX32
6XXXX3

Y la ultima condición es que :
Entre 2/3/6/5 solo puede haber 1.

X215XX
X3112X
XXXX32
611113

Todo lo demas que no fue seteado pueden ser 1 o 4!



El código no es en C pero me serviría igual ver un pseudocodigo! Si hace falta muestro lo que hice pero es muy feo  :-X  
Si es muy largo el pseudocodigo con que me den algún tip se los agradezco!


« Última modificación: 8 Marzo 2018, 00:00 am por nonokario » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Creacion de matriz
« Respuesta #1 en: 8 Marzo 2018, 13:34 pm »

Oky, muestra lo que tienes hecho.


En línea

nonokario

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Creacion de matriz
« Respuesta #2 en: 8 Marzo 2018, 15:14 pm »

Código
  1. func setter_matrix(x, y):  #a esta funcion la llamo desde un for de afuera para setear numeros de 1 a 6 y la entrada(5) y salida(6)
  2. if x == 0 and entrada_creada == false:
  3. randomize()
  4. var n = randi()%5+1
  5. if n == 5:
  6. entrada_creada = true
  7. if y == WIDTH-1:
  8. entrada_creada = true
  9. return 5
  10. return n
  11. elif x == 3 and salida_creada == false:
  12. randomize()
  13. var n2 = randi()%6+1
  14. if n2 == 6:
  15. salida_creada = true
  16. if y == WIDTH-1:
  17. entrada_creada = true
  18. return 6
  19. if n2 == 5:
  20. return 1
  21. return n2
  22. else:
  23. return randi()%4+1
  24.  
  25.  
  26.  
  27.  
  28.  
  29. #Funcion para asegurar que haya: Entrada, Salida y 2/3
  30. func corregir_matrix(matrix):
  31. var encontrado2
  32. var entrada
  33. var bajada
  34. for x in range(WIDTH):
  35. encontrado2 = false
  36. for y in range(HEIGHT):
  37. if x == 0:
  38. if matrix[x][y] == 5:
  39. entrada = y
  40. if x != HEIGHT -1 :
  41. if (matrix[x][y] == 2) and (encontrado2 == false):
  42. matrix[x+1][y] = 3
  43. encontrado2 = true
  44. bajada = y
  45. elif matrix[x][y] == 2 and encontrado2 == true:
  46. matrix[x][y] = 1
  47. elif y == WIDTH-1 and encontrado2 == false:
  48. if x == 0:
  49. if entrada + 2 < WIDTH:
  50. matrix[x][entrada+2] = 2
  51. matrix[x+1][entrada+2] = 3
  52. bajada = entrada + 2
  53. else:
  54. matrix[x][entrada-2] = 2
  55. matrix[x+1][entrada-2] = 3
  56. bajada = entrada - 2
  57. else:
  58. if bajada + 2 < WIDTH:
  59. matrix[x][bajada+2] = 2
  60. matrix[x+1][bajada+2] = 3
  61. bajada = bajada + 2
  62. else:
  63. matrix[x][bajada-2] = 2
  64. matrix[x+1][bajada-2] = 3
  65. bajada = bajada - 2
  66. else:
  67. if matrix[x][y] == 6:
  68. return matrix
  69. for y in range(HEIGHT):
  70. if matrix[3][y] == 3:
  71. if y + 2 < WIDTH:
  72. matrix[3][y+2] = 6
  73. return matrix
  74. else:
  75. matrix[3][y-2] = 6
  76. return matrix
  77. return matrix
  78.  
  79.  
  80.  
  81.  
  82. #Funcion para asegurar que haya unos entre 2/3/5/6
  83. func corregir_matriz_2(matrix):
  84. var entrada
  85. var salida
  86. var bajada1
  87. var bajada2
  88. var aux
  89. for x in range(WIDTH):
  90. for y in range(HEIGHT):
  91. if x == 0:
  92. if matrix[x][y] == 2: ###
  93. bajada1 = y
  94. if matrix[x][y] == 5:
  95. entrada = y
  96. elif x != 0 and x != HEIGHT -1 :
  97. if matrix[x][y] == 2: ###
  98. bajada1 = y
  99. elif matrix[x][y] == 3 and matrix[x-1][y] == 2:
  100. bajada2 = y
  101. else:
  102. if matrix[x][y] == 3 and matrix[x-1][y] == 2:
  103. bajada2 = y
  104. elif matrix[x][y] == 6:
  105. salida = y
  106.  
  107.  
  108. if x == 0:
  109. if bajada1 < entrada:
  110. aux = entrada - (bajada1)
  111. for y in range(aux):
  112. if matrix[x][bajada1+y] == 4:  #Antes: bajada+1 Ahora: bajada+y
  113. matrix[x][bajada1+y] = 1   #Si era + 1 siempre reemplazaba en el mismo lugar
  114. else:
  115. aux = bajada1 - (entrada)
  116. for y in range(aux):
  117. if matrix[x][entrada+y] == 4:
  118. matrix[x][entrada+y] = 1
  119.  
  120. elif x != 0 and x != HEIGHT -1 :
  121. if bajada1 < bajada2:
  122. aux = bajada2 - (bajada1)
  123. for y in range(aux):
  124. if matrix[x][bajada1+y] == 4:
  125. matrix[x][bajada1+y] = 1
  126. else:
  127. aux = bajada1 - (bajada2)
  128. for y in range(aux):
  129. if matrix[x][bajada2+y] == 4:
  130. matrix[x][bajada2+y] = 1
  131.  
  132. else:
  133. if bajada2 < salida:
  134. aux = salida - (bajada2)
  135. for y in range(aux):
  136. if matrix[x][bajada2+y] == 4:
  137. matrix[x][bajada2+y] = 1
  138. else:
  139. aux = bajada2 - (salida)
  140. for y in range(aux):
  141. if matrix[x][salida+y] == 4:
  142. matrix[x][salida+y] = 1
  143. return matrix
  144.  
  145.  


Perdón, es muy feo el código pero funciona. Por eso queria saber si hay una manera mas elegante o mejor de hacerlo. Con pseudocodigo me arreglo!
« Última modificación: 8 Marzo 2018, 15:16 pm por nonokario » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Creacion de matriz
« Respuesta #3 en: 8 Marzo 2018, 20:39 pm »

Bueno, creo que te has complicado un poco.
Empieza instalando un valor que indique que la casilla está vacía, yo he usado el 0 (aprovechando que 0 significa también false y cualquier otro número true).

El primer paso de meter el 5 y el 6 en la primera y última fila es muy sencillo ya que la matriz está vacía. Caigan donde caigan están bien.

Para incluir el 2 y el 3 tampoco tiene mucha complicación. Se corre la matriz por filas desde el inicio hasta penúltima fila. Por fila:
· Buscar una misma columna vacía para y e y+1
· En y incluir el 2.
· En y+1 incluir el 3.

Para incluir los entre números aprovecha las marcas de casilla vacía. Prepara una bandera para indicar si debes escribir los unos o no.

Por cada fila:
· desactiva la badnera
· Por cada columna:
   · Si la bandera está desactivada y la casilla no está vacía:
      · activa la bandera (Después de activar esa bandera no debes hacer nada y esperar a la siguiente iteración)
   · Y si no:
      · Si la casilla está vacía:
         · escribe un 1 en ella
      · Y si no:
         · termina el bucle columna

Para terminar de rellenar la matriz recórrela casilla por casilla. Si la casilla está vacía introduce 1 o 4 aleatoriamente.

Esto en C11 quedaría así:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <stdbool.h>
  5.  
  6. /* Matriz global por lo que
  7.  * al crearla se llena de ceros ( 0 )
  8.  * así que aprovecharé eso para
  9.  * marcar la posición vacía
  10.  */
  11. #define FILAS 4u
  12. #define COLUMNAS 6u
  13.  
  14. int matriz[FILAS][COLUMNAS];
  15.  
  16. // devuelve una casilla vacia aleatoria
  17. // en la fila y del array
  18. unsigned columna_vacia_en_fila(unsigned fila) {
  19.    unsigned x;
  20.  
  21.    do {
  22.        x = rand()%COLUMNAS;
  23.    } while(matriz[fila][x] && matriz[fila+1][x]);
  24.  
  25.    return x;
  26. }
  27.  
  28. // incluir el 5 en la primera fila
  29. // y el 6 en la última fila
  30. void incluir_5_6() {
  31.    unsigned x;
  32.  
  33.    x = rand()%COLUMNAS;
  34.    matriz[0][x] = 5;
  35.  
  36.    x = rand()%COLUMNAS;
  37.    matriz[FILAS-1][x] = 6;
  38. }
  39.  
  40. // incluir el 2 en fila y+1
  41. // y el 3 en la fila y+1
  42. void incluir_2_3() {
  43.    unsigned x, y;
  44.  
  45.    for(y=0; y<FILAS-1; ++y) {
  46.        x = columna_vacia_en_fila(y);
  47.        matriz[y][x] = 2;
  48.        matriz[y+1][x] = 3;
  49.    }
  50. }
  51.  
  52. // incluir el 1 entre dos números en una fila
  53. // por cada fila
  54. void incluir_1_entre() {
  55.    unsigned x, y;
  56.    bool escribir;
  57.  
  58.    for(y=0; y<FILAS; ++y) {
  59.        escribir = false;
  60.        for(x=0; x<COLUMNAS; ++x) {
  61.            if(!escribir && matriz[y][x]) {
  62.                escribir = true;
  63.            }
  64.            else {
  65.                if(matriz[y][x]) break;
  66.                else matriz[y][x] = 1;
  67.            }
  68.        }
  69.    }
  70. }
  71.  
  72. // rellenar indistintamente con 1
  73. // y 4 las casillas que faltan
  74. void incluir_1_4() {
  75.    unsigned x, y;
  76.  
  77.    for(y=0; y<FILAS; ++y) {
  78.        for(x=0; x<COLUMNAS; ++x) {
  79.            if(matriz[y][x] == 0) {
  80.                matriz[y][x] = rand()%2? 4 : 1;
  81.            }
  82.        }
  83.    }
  84. }
  85.  
  86. // imprimir la matriz
  87. void imprimir() {
  88.    unsigned x, y;
  89.  
  90.    for(y=0; y<FILAS; ++y) {
  91.        for(x=0; x<COLUMNAS; ++x) {
  92.            printf("%d ", matriz[y][x]);
  93.        }
  94.        puts("\n");
  95.    }
  96. }
  97.  
  98. int main() {
  99.    srand(time(NULL));
  100.  
  101.    incluir_5_6();
  102.    incluir_2_3();
  103.    incluir_1_entre();
  104.    incluir_1_4();
  105.  
  106.    imprimir();
  107. }



Gracias a un dato apuntado por NEBIRE en la siguiente respuesta me he dado cuenta de algo que se me había pasado por alto: el 2 y el 3 deben estar en la misma columna.
Solucionado en la reedición.
« Última modificación: 8 Marzo 2018, 22:26 pm por MAFUS » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Creacion de matriz
« Respuesta #4 en: 8 Marzo 2018, 21:23 pm »

Tengo que crear una matriz de numeros ( 1 a 6) con un ancho X y un largo Y
en tu ejemplo 6x4, x=6 y=4, ok...

 
El array Z0 debe tener un 5  y el Z-1 un 6. Entonces quedaría algo asi:
XXX5XX
XXXXXX
XXXXXX
6XXXXX


Elige al azar una columna en sendas filas y la rellenas con el susodcho valor.
Código:
    n = Random(entre 0 y x-1)
    Array(0, n) = 5  // línea 0 posición n, un 5

    n = Random(entre 0 y x-1)
    Array(y-1, n) = 6  // linea 3, posicion n, un 6.


La siguiente condición es que en Zx debe existir un 2 y en Zx+1 un 3.
X2X5XX
X3XX2X
XXXX32
6XXXX3
Esta parte, no acabo de entenderlo.

No sé a que llamas Zx, mirando el array... ¿una fila, una columna, una columna de una fila, de varias?

Vale, tras mirarlo más veces, creo entender que lo que tratas de hacer es crear un 2 en cada línea excepto la última y asignar un 3 en la misma columna pero en la siguiente fila.
Si es así, este sería el pseudocódigo:
Código:
    bucle para k desde 0 hasta y-2
        hacer
            n = random(entre 0 y x-1)
        repetir mientras array(k,n) distinto de 0  // no queremos que sobrescriba el 5 ni el 6

        Array(k,n)=2
        Array(k+1, n)=3
    siguiente en bucle


Y la ultima condición es que :
Entre 2/3/6/5 solo puede haber 1.
X215XX
X3112X
XXXX32
611113

Entiendo que entre 2 y 2,3,5,6; entre 3 y 2,3,5,6; entre 5 y 2,3 y entre 6 y 2,3. Pero no entre 5 y 6, porque no están en la misma línea (ni pueden estarlo), Así como tampoco 2 cincos ni 2 seis.
Código:
    bucle para k desde 0 a y-1 // por cada linea 
        // buscar punto de comienzo
        bucle para j desde 0 a x-2  // por cada columna  
            Si array(k,j) = 2,3,5 ó 6 luego //buscamos un valor en la fila (2,3,5,6)
                ini= j    // y lo recordamos.
                salir del bucle
            fin si
        siguiente en bucle
        
        // buscar punto final
        bucle para j desde ini+1 a x-1  
            Si array(k,j) = 2,3 ó 5 luego buscamos un valor en la fila (2,3,5,6)
                fin= j
                salir del bucle
            fin si
        siguiente en bucle

        // rellenar entre medias (de inicio y final)...
        bucle para j desde (ini +1) hasta (fin-1)
             array(k, j) = 1
        siguiente en bucle
    siguiente en bucle
El código en esta sección se puede optimizar (yo lo dejo así por claridad), por ejemplo:
    - recorriendo el bucle segundo desde el final hacia atrás...
    - mientras no se encuentre el valor final, escribir YA el 1, haciendo innecesario el bucle final.
    - en vez de salir de un bucle, anidar dentro de él el siguiente bucle (aunque en líea ganan en claridad).

Todo lo demas que no fue seteado pueden ser 1 ó 4

Se supone que lo que no tiene 'valor' es 0... es decir que inicialmente el contenido del array era todos ceros.
Código:
bucle para k desde 0 a y-1  // por cada linea
    bucle para j desde 0 a x-1 // por cada columna
        Si Array(k,j) = 0
           n= random(entre 0 y 1)  //elegir 1 de 2 opciones
           n = ((n * 3) +1)   // Si False = 1, si TRUE=4
           Array(k,j) = n
        fin si
    siguiente en bucle
siguiente en bucle

« Última modificación: 8 Marzo 2018, 21:40 pm por NEBIRE » En línea

nonokario

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Creacion de matriz
« Respuesta #5 en: 8 Marzo 2018, 23:42 pm »

Muchas gracias! Aprendí mucho  :D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda - Buscar si existe una matriz dentro de otra matriz
Programación Visual Basic
EddyW 2 6,022 Último mensaje 14 Agosto 2010, 06:18 am
por EddyW
MATRIZ que imprima como una matriz en forma de cuadrado... ayudaaaaa!! help
Programación C/C++
oscarpy 3 8,814 Último mensaje 9 Abril 2012, 16:23 pm
por Xandrete
Juego con matriz dinámica en c++, función para rrecorrer matriz
Programación C/C++
jajaimess 1 3,957 Último mensaje 21 Junio 2014, 05:21 am
por .:UND3R:.
Punteros creacion de matriz
Programación C/C++
Ja_90 5 2,949 Último mensaje 8 Septiembre 2015, 14:08 pm
por someRandomCode
Creacion Matriz nxn Automatica « 1 2 »
Programación C/C++
miguelc++ 10 7,377 Último mensaje 24 Noviembre 2021, 15:54 pm
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines