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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


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

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Ayuda en trabajo de Arreglos/Matrices
« en: 5 Mayo 2016, 17:26 pm »

El ejercicio me pide que haga una matriz 11x11 con una coordenada (x,y) ingresada por el usuario que sea 0. Los numeros adyacentes a la coordenada (x,y) = 0 tienen que ser 1, luego 2 y asi consecutivamente hasta completar la matriz 11x11.

x: 5
y: 5

5 5 5 5 5 5 5 5 5 5 5
5 4 4 4 4 4 4 4 4 4 5
5 4 3 3 3 3 3 3 3 4 5
5 4 3 2 2 2 2 2 3 4 5
5 4 3 2 1 1 1 2 3 4 5
5 4 3 2 1 0 1 2 3 4 5
5 4 3 2 1 1 1 2 3 4 5
5 4 3 2 2 2 2 2 3 4 5
5 4 3 3 3 3 3 3 3 4 5
5 4 4 4 4 4 4 4 4 4 5
5 5 5 5 5 5 5 5 5 5 5


Tengo este codigo que logra parcialmente algo como lo de arriba.

#include <iostream>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <iomanip>

using namespace std;

int main(int argc, char** argv) {
   
   int x, y;
   cout << "X: "; cin >> x;
   cout << "Y: "; cin >> y;
   
   int m[11][11] = {{0}};
   m
  • [y] = 0;
   
   for (int fila = 0; fila < 11; fila++)
   {
         for (int col = 0; col <= fila; col++)
         {
            m[fila][col] = abs(fila - y);
         }   
         for (int col = 11; col >= fila; col--)
            {
               m[fila][col] = abs(col - x);
            }
   }
   
   for (int fila = 0; fila < 11; fila++)
   {
      for (int col = 0; col < 11; col++)
      {
         cout << setw(4) << m[fila][col];
      }
      cout << endl;
   }
         
   return 0;
}



GRACIAS DE ANTEMANO


« Última modificación: 5 Mayo 2016, 18:03 pm por JoseBerru » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.575



Ver Perfil
Re: Ayuda en trabajo de Arreglos/Matrices
« Respuesta #1 en: 5 Mayo 2016, 19:57 pm »

Si a una mitad del recuadro la tratas de una forma y a la otra mitad la tratas de otra nunca llegarás a una solución coherente.
En vez de usar un cuadro de 11x11 usa uno de 3x3 y sitúate en el centro. Obviamente el anillo exterior todo son 1s.
Código:
111
101
111
Reduciendo más el problema, si tomas en cuenta solo la distancia de los puntos en el eje X
Código:
101
101
101
y teniendo en cuenta solo la distancia de los puntos en el eje Y
Código:
111
000
111
Superponiendo estos dos últimos recuadros y tomando la conjunción lógica de ambos queda
Código:
101
000
101
¿Qué operación hace que los 0 del anillo tomen el valor de las esquinas?


En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Ayuda en trabajo de Arreglos/Matrices
« Respuesta #2 en: 5 Mayo 2016, 20:19 pm »

Te sirve en javascript?

Código
  1. // Cantidad de numeros a utilizar
  2. var payload = 5;
  3.  
  4. var reverse = false;
  5. // Dos vueltas: superior e inferior, el inferior es un espejo del superior
  6. for(var a = 1; a <= 2; a++){
  7.  
  8.    if(reverse){
  9.        var minimo         = 1;
  10.        var agregar_centro = 0;
  11.    }else{
  12.        var minimo         = payload;
  13.        var agregar_centro = 1;
  14.    }
  15.  
  16.    for(var b = 1; b <= payload + agregar_centro; b++){
  17.  
  18.        var line = '';
  19.  
  20.        for(var c = payload; 1 <= c; c--){
  21.            if(c < minimo)
  22.                line += minimo + '';
  23.            else
  24.                line += '' + c;
  25.        }
  26.  
  27.        // Centro
  28.        if((!reverse) && (b == (payload + agregar_centro))){
  29.            // Última vuelta de la mitad del cuadrado.
  30.            line += '0';
  31.            reverse = true;
  32.        }else{
  33.            line += minimo;
  34.        }
  35.  
  36.        for(var d = 1; d <= payload; d++){
  37.            if(d < minimo)
  38.                line += minimo + '';
  39.            else
  40.                line += '' + d;
  41.        }
  42.  
  43.        if(reverse)
  44.            minimo++;
  45.        else
  46.            minimo--;
  47.  
  48.        console.log(line);
  49.  
  50.    }
  51. }

Código:
55555555555
54444444445
54333333345
54322222345
54321112345
54321012345
54321112345
54322222345
54333333345
54444444445
55555555555


Ahora, como son dos pisos, uno superior y el de abajo un espejo podrias hacer solo la mitad de la cara y luego replicarlo en algún stack ordenado:

Código
  1. var payload = 5;
  2. var lines   = [];
  3. var minimo  = payload
  4.  
  5. for(var b = 1; b <= payload + 1; b++){
  6.  
  7.    var line = '';
  8.  
  9.    for(var c = payload; 1 <= c; c--){
  10.        if(c < minimo)
  11.            line += minimo + '';
  12.        else
  13.            line += '' + c;
  14.    }
  15.  
  16.    if(b == (payload + 1)){
  17.        // Última vuelta de la mitad del cuadrado.
  18.        line += '0';
  19.    }else{
  20.        line += minimo;
  21.    }
  22.  
  23.    for(var d = 1; d <= payload; d++){
  24.        if(d < minimo)
  25.            line += minimo + '';
  26.        else
  27.            line += '' + d;
  28.    }
  29.  
  30.    minimo--;
  31.  
  32.    console.log(line);
  33.    lines.push(line + '\n');
  34. }
  35.  
  36. lines.pop();
  37. lines.reverse();
  38. for(_key in lines)
  39.    console.log(lines[_key]);

Código:
55555555555
54444444445
54333333345
54322222345
54321112345
54321012345
54321112345
54322222345
54333333345
54444444445
55555555555


Ahora, si lo piensas mejor son 4 lados, solo dibujas uno y los demas son espejos del mismo, es como tener una hoja de papel doblado en 4 con el cero en común como único centro pero hacer eso en c++ puede que salga mucho mas trabajoso y largo que invertir los for manualmente como te lo mostré anteriormente.



El primer grupo rojo corresponde a lo que realmente debes hacer, el segundo grupo rojo es la columna que unirá el lado derecho con el lado izquierdo, este debe decir que si no es la última línea entonces debe ser igual al último número de la fila, en caso contrario es cero. Luego de eso el restante derecho es el mismo contenido del izquierdo pero al reves, luego la parte inferior es igual a la superior pero al reves menos la última fila que corresponde al concatenador cero.

De todas maneras acá está el código del papel doblado en 4:

Código
  1. var payload = 5;
  2. var lines   = [];
  3. var min     = payload
  4.  
  5. for(var a = 1; a <= payload + 1; a++){
  6.    var line = [];
  7.    for(var b = payload; 1 <= b; b--)
  8.        line.push((b < min) ? min : b);
  9.    lines.push(line);
  10.    min--;
  11. }
  12.  
  13. var lines_str = [];
  14. for(a in lines){
  15.    var out  = lines[a].join('');
  16.    out += (a == (lines.length - 1)) ? 0 : lines[a][lines[a].length - 1];
  17.    lines[a].reverse();
  18.    out += lines[a].join('');
  19.    lines_str.push(out);
  20. }
  21.  
  22. var tmp = lines_str.slice(0);
  23. lines_str.pop();
  24. lines_str.reverse();
  25. for(a in lines_str)
  26.    tmp.push(lines_str[a]);
  27. lines_str = tmp;
  28.  
  29. for(a in lines_str)
  30.    console.log(lines_str[a]);

Código:
55555555555
54444444445
54333333345
54322222345
54321112345
54321012345
54321112345
54322222345
54333333345
54444444445
55555555555


Lo que puedes hacer es tomar estos códigos como conceptos, estudiarlos y hacer tu propio código en c++. La práctica es la mejor ayuda cuando necesitas estudiar y aprender, por eso no te hice el código en c++, para que lo tengas que hacer tu entendiendo la lógica.

Saludos.
« Última modificación: 5 Mayo 2016, 20:40 pm por WHK » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.575



Ver Perfil
Re: Ayuda en trabajo de Arreglos/Matrices
« Respuesta #3 en: 5 Mayo 2016, 20:38 pm »

Está bien lo de la optimización, pero te has saltado lo de que el usuario entra la coordenada de donde quiere el 0. Si lo pone en una esquina no puede haber espejos y el máximo valor del recuadro es 10.
En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Ayuda en trabajo de Arreglos/Matrices
« Respuesta #4 en: 5 Mayo 2016, 20:44 pm »

Está bien lo de la optimización, pero te has saltado lo de que el usuario entra la coordenada de donde quiere el 0. Si lo pone en una esquina no puede haber espejos y el máximo valor del recuadro es 10.

Esa parte no lo habia leido xD pero se me ocurre que si el cuadro es de un máximo de 10x10 es porque solo puedes escribir hasta el 9, no puedes dibujar un 10 o se te corre la línea, en ese caso lo que yo haría es hacer un cuadrado de 9x9, es solo cuestión de modificar el script que hice y reemplazar el 5 por el 9 y despues hacer un padding xy eliminando lo sobrante dejando el 0 en la posicion donde tu quieras, pero la malla ya está hecha, solo faltaría mover y cortar con un padding y un shift.
« Última modificación: 5 Mayo 2016, 20:47 pm por WHK » En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Ayuda en trabajo de Arreglos/Matrices
« Respuesta #5 en: 5 Mayo 2016, 20:50 pm »

Es sencillo. Puedes ver el patrón restando la posición del carácter que estás escribiendo menos la fila y la columna en la que esté el 0. El valor de la casilla será el mayor valor de esas dos restas. Por supuesto, tendrás que hacer el valor absoluto si no quieres números negativos
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Ayuda en trabajo de Arreglos/Matrices
« Respuesta #6 en: 6 Mayo 2016, 05:06 am »

Vamos, acá va:

Código
  1. // Pointer XY
  2. var pointer_x         = 6;                   // X (1 to 11)
  3. var pointer_y         = 6;                   // Y (1 to 11)
  4.  
  5. var payload           = 9;                   // Max number. Total rows * 2 + 1 (xy:9876543210123456789)
  6. var max_rows          = 11;                  // Max width & height rows to show
  7. var current_pointer_x = ((payload * 2) + 1); // Current pointer X
  8. var current_pointer_y = ((payload * 2) + 1); // Current pointer Y
  9. var lines             = [];                  // Array
  10. var floor             = payload;             // Dinamic floor
  11. var clon              = [];                  // Array
  12.  
  13.  
  14. // Buffer
  15. for(var a = 1; a <= payload + 1; a++){
  16.    var line = [];    // Empty line (array)
  17.    for(var b = payload; 1 <= b; b--)
  18.        line.push((b < floor) ? floor : b); // If number is < to floor: number, else: floor
  19.    lines.push(line); // Append line to lines
  20.    floor--;          // Floor reduction
  21. }
  22.  
  23.  
  24. // Horizontal mirror (right)
  25. clon  = lines.slice(0); // Clone array
  26. lines = [];             // Clear array
  27. for(a in clon){
  28.    var final_line = clon[a].slice(0); // Clone line to final line (left half)
  29.    final_line.push((a == (clon.length - 1)) ? 0 : clon[a][clon[a].length - 1]); // Center (n or 0)
  30.    clon[a].reverse();      // Invert line
  31.    for(b in clon[a])       // Append inverted line to final line
  32.        final_line.push(clon[a][b]);
  33.    lines.push(final_line); // Push final line
  34. }
  35.  
  36.  
  37. // Vertical mirror (bottom)
  38. clon = lines.slice(0); // Clone array
  39. clon.pop();            // Remove center line (the pointer)
  40. clon.reverse();        // Invert array
  41. for(a in clon)         // Append array inverted into lines array
  42.    lines.push(clon[a]);
  43.  
  44.  
  45. // Move area [[]]
  46. shift_left = (payload - pointer_x);
  47. shift_top  = (payload - pointer_y);
  48.  
  49. // Cut area
  50. clon = lines.slice(0); // Clone array
  51. lines = [];            // Reset array
  52. for(var a = 0; a <= clon.length - 1; a++){
  53.    var line = [];
  54.    for(var b = 0; b <= clon[a].length - 1; b++){
  55.        if(
  56.            ( a > shift_top)  &&                   // Cut top
  57.            ((a - shift_top)  < (max_rows + 1)) && // Cut bottom
  58.            ( b > shift_left) &&                   // Cut left
  59.            ((b - shift_left) < (max_rows + 1))    // Cut right
  60.        ){
  61.            line.push(clon[a][b]);
  62.        }
  63.    }
  64.    if(line.length)       // Have line?
  65.        lines.push(line); // Append line to lines
  66. }
  67.  
  68.  
  69. // Print result
  70. str = '';
  71. for(a in lines)
  72.    str += lines[a].join(' ') + '\n';
  73. console.log(str);

Código:
5 5 5 5 5 5 5 5 5 5 5
5 4 4 4 4 4 4 4 4 4 5
5 4 3 3 3 3 3 3 3 4 5
5 4 3 2 2 2 2 2 3 4 5
5 4 3 2 1 1 1 2 3 4 5
5 4 3 2 1 0 1 2 3 4 5
5 4 3 2 1 1 1 2 3 4 5
5 4 3 2 2 2 2 2 3 4 5
5 4 3 3 3 3 3 3 3 4 5
5 4 4 4 4 4 4 4 4 4 5
5 5 5 5 5 5 5 5 5 5 5

Si cambio las posiciones XY queda así:

Código
  1. var pointer_x         = 1;                   // X (1 to 11)
  2. var pointer_y         = 1;                   // Y (1 to 11)
Código:
0 1 2 3 4 5 6 7 8 9
1 1 2 3 4 5 6 7 8 9
2 2 2 3 4 5 6 7 8 9
3 3 3 3 4 5 6 7 8 9
4 4 4 4 4 5 6 7 8 9
5 5 5 5 5 5 6 7 8 9
6 6 6 6 6 6 6 7 8 9
7 7 7 7 7 7 7 7 8 9
8 8 8 8 8 8 8 8 8 9
9 9 9 9 9 9 9 9 9 9

Código
  1. var pointer_x         = 7;                   // X (1 to 11)
  2. var pointer_y         = 3;                   // Y (1 to 11)
Código:
6 5 4 3 2 2 2 2 2 3 4
6 5 4 3 2 1 1 1 2 3 4
6 5 4 3 2 1 0 1 2 3 4
6 5 4 3 2 1 1 1 2 3 4
6 5 4 3 2 2 2 2 2 3 4
6 5 4 3 3 3 3 3 3 3 4
6 5 4 4 4 4 4 4 4 4 4
6 5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6 6
7 7 7 7 7 7 7 7 7 7 7
8 8 8 8 8 8 8 8 8 8 8

Ahora la explicación:

Lo que hace es crear un buffer inicial, un cuarto de todo el cuadrado, luego solamente lo clona vertical y luego horizontal tal como lo expliqué en el post anterior. Se crea un cuadrado de 19 columnas y filas, esto quiere decir del 9 al 9 mas un centro = 18 + 1, después de esto se crea una segunda capa imaginaria de 11x11 (del 5 al 5 mas el centro) y recorta los bordes restantes, de esta manera se obtiene el puntero en la posición requerida. Imagina dos capas donde una capa superior es el recuadro y debajo de ella un cuadrado mucho mas grande con un punto al centro, si mueves la capa que está debajo podrás posicionar el punto donde tu quieras con el tamaño del recuadro de encima.

En esta imagen el puntero se localiza en la posición X:8 Y:7


De todas maneras como dijo MAFUS el resultado no siempre será coherente ya que no existe una mitad exacta, para simular una mitad colocando el cero al centro debes agregar una columna adicional por lo cual cuando quieres posicionar el puntero en X:1 Y:1 te faltará un número después del 9 (y no puede ser 10) ya que en el ejemplo que pusiste dices que el ancho total es de 5 a 1, el centro y luego de 1 a 5 por lo cual son 11, asi que si posicionas el cero en la primera columna te quedan 10 para rellenar, del 1 al 9 y luego que?, falta un número. En mi caso lo omití, si pones el puntero en X:1 Y:1 aparece una columna menos y una fila menos, el cuadrado deja de ser de 11x11 para ser de 10x10 (0 al 9). Para solucionar esto el tamaño del cuadrado a mostrar debiera ser de 9 (4 al 1 mas el centro y del 1 al 4), de esta manera si posiciono el cero en la primera columna solo debo rellenar 8 espacios (del 1 al 8). En el script se soluciona cambiando [payload] de 9 a 8 y [max_rows] de 11 a 9. El problema de raiz está en que el número máximo es impar y debiera ser el mayor par que pueda soportar una area de números del 0 al 9, o sea el 8 y no el 9.

Código:
0 1 2 3 4 5 6 7 8
1 1 2 3 4 5 6 7 8
2 2 2 3 4 5 6 7 8
3 3 3 3 4 5 6 7 8
4 4 4 4 4 5 6 7 8
5 5 5 5 5 5 6 7 8
6 6 6 6 6 6 6 7 8
7 7 7 7 7 7 7 7 8
8 8 8 8 8 8 8 8 8


Espero que hayas podido comprender bien.

Saludos.
« Última modificación: 6 Mayo 2016, 05:21 am por WHK » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con arreglos
Java
Slayer_Zero 3 2,384 Último mensaje 20 Junio 2012, 08:23 am
por s00rk
Ayuda con ARREGLOS MULTIDIMENCIONALES (matrices)
Programación C/C++
poroto_q 6 2,759 Último mensaje 25 Julio 2012, 10:03 am
por poroto_q
Ayuda arreglos
Java
iChris 2 2,229 Último mensaje 22 Septiembre 2012, 09:07 am
por horny3
[c] Necesito ejercicios de Arreglos y matrices
Programación C/C++
Dacan 4 2,265 Último mensaje 12 Abril 2013, 01:54 am
por 85
ordenamiento de matrices (arreglos)
Programación C/C++
sjav96 2 1,474 Último mensaje 15 Mayo 2016, 14:29 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines