Título: Ayuda en trabajo de Arreglos/Matrices Publicado por: JoseBerru 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
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 Título: Re: Ayuda en trabajo de Arreglos/Matrices Publicado por: MAFUS 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 Código: 101 Código: 111 Código: 101 Título: Re: Ayuda en trabajo de Arreglos/Matrices Publicado por: WHK en 5 Mayo 2016, 20:19 pm Te sirve en javascript?
Código
Código: 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
Código: 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. (https://65.media.tumblr.com/9ea7dd06637e9d50319d6516861c0cbe/tumblr_o6pvrq5Psk1uzz9lco1_250.png) 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
Código: 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. Título: Re: Ayuda en trabajo de Arreglos/Matrices Publicado por: MAFUS 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.
Título: Re: Ayuda en trabajo de Arreglos/Matrices Publicado por: WHK 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. Título: Re: Ayuda en trabajo de Arreglos/Matrices Publicado por: class_OpenGL 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
Título: Re: Ayuda en trabajo de Arreglos/Matrices Publicado por: WHK en 6 Mayo 2016, 05:06 am Vamos, acá va:
Código
Código: 5 5 5 5 5 5 5 5 5 5 5 Si cambio las posiciones XY queda así: Código
Código: 0 1 2 3 4 5 6 7 8 9 Código
Código: 6 5 4 3 2 2 2 2 2 3 4 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 (https://65.media.tumblr.com/1184812c695c5be5dec6f78a6139aca9/tumblr_o6qiy4tMXU1uzz9lco1_400.png) 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 Espero que hayas podido comprender bien. Saludos. |