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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


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

Desconectado Desconectado

Mensajes: 41



Ver Perfil
Duda sobre vectores!
« en: 24 Diciembre 2015, 09:30 am »

Saludos!,

Llevo un par de semanas realizando el famoso juego 2048 para PC, la verdad es que me está gustando mucho e incluso voy avanzando rápido, pero me he quedado atascado en un punto y tengo algunas dudas para realizar dicho proceso:

Al mover los números del tablero hacia una dirección, se mueven todos juntos "concatenándose" y sumando los que tengan el mismo valor y estén pegados, he aquí mi duda.

He pensado que podría copiar cada fila o columna (dependiendo si se ordenan de arriba a abajo o de izquierda a derecha) en un vector de ocupación variable auxiliar, y luego volviendo a copiar esa información a la fila/columna del tablero, el problema es que no se me ocurre como realizar el algoritmo para sumar los iguales, siempre me acaba dando algún error a pesar de haber escrito decenas de tipos.

¿Alguien podía echarme una mano mediante un pseudocódigo o algunas pautas iniciales para su realización, o si se le ocurre otro método?.

GRACIAS! :D


En línea

"Mientras tu duermes, hay otra persona en otro lugar del planeta trabajando para ser mejor en lo que tu quieres llegar a ser"
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Duda sobre vectores!
« Respuesta #1 en: 24 Diciembre 2015, 17:21 pm »

Siendo 0 un vacío, supon una fila o columna así:
0 1 1 2
Si hay que apilarlos hacia la izquierda, harías algo como:
Código
  1. #include <iostream>
  2.  
  3. int main(){
  4. int arr[4] = {0,1,1,2};
  5. int temp = -1;
  6.  
  7. for(int i=0; i<4; i++){ // SUMAMOS LOS NÚMEROS IGUALES CONSECUTIVOS
  8. if(temp!=-1){
  9. if(arr[temp]==arr[i]){ // Encontrados dos consecutivos iguales
  10. arr[temp] = 0; // Eliminamos uno
  11. arr[i] *= 2; // Duplicamos el otro
  12. temp = -1;
  13. }else{
  14. temp = i; // Si no son iguales, cogemos el último
  15. }
  16. }else if(arr[i]!=0){
  17. temp = i;
  18. }
  19. }
  20.  
  21. temp = 0;
  22. for(int i=0; i<4; i++) // COLOCAMOS TODOS LOS NÚMEROS AL PRINCIPIO
  23. if(arr[i]!=0){
  24. arr[temp++] = arr[i];
  25. arr[i] = 0;
  26. }
  27.  
  28. for(int i=0; i<4; i++)
  29. std::cout << arr[i] << " ";
  30. }

Luego tendrás que saber hacia que lado se apila y todo eso. Eso ya queda de tu mano.


En línea

Sr_Malweriks

Desconectado Desconectado

Mensajes: 41



Ver Perfil
Re: Duda sobre vectores!
« Respuesta #2 en: 28 Diciembre 2015, 00:52 am »

Perfecto gracias!, mañana lo probaré a ver que tal...:D:D:D:D:D
En línea

"Mientras tu duermes, hay otra persona en otro lugar del planeta trabajando para ser mejor en lo que tu quieres llegar a ser"
Sr_Malweriks

Desconectado Desconectado

Mensajes: 41



Ver Perfil
Re: Duda sobre vectores!
« Respuesta #3 en: 29 Diciembre 2015, 12:22 pm »

Me está costando entender tu código....

¿Podrías hacer una adaptación a este ejemplo?

vector = (2,2,4,0) y lo queremos sumar hacia la izquierda, quedando así:  vector = (4,4,0,0).

No encuentro la forma de verlo... :S
En línea

"Mientras tu duermes, hay otra persona en otro lugar del planeta trabajando para ser mejor en lo que tu quieres llegar a ser"
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Duda sobre vectores!
« Respuesta #4 en: 29 Diciembre 2015, 14:40 pm »

Dividí el código en 2 partes, ahí las marqué con comentarios (los 2 for).

En la primera, solo sumamos todos los números. Pasaría de:
0 1 1 2
A:
0 0 2 2

En la segunda, movemos todos los números distintos de 0 (no vacíos), a la izquierda (en este caso; derecha si se apilan hacia la derecha).
Quedaría:
2 2 0 0

La segunda parte, acabo de ver, que tiene un error. Aquí al final te pongo el código final.

La segunda parte primero, la más rápida:
"temp" guarda la posición vacía en la que meteremos los números. Empieza por la primera casilla igual a 0. A partir de esa casilla, cuando encontramos un número diferente de 0 (una casilla no-vacía), lo intercambiamos con la posición vacía. por ejemplo, pasaría de:
0 0 2 2  (temp=0, i=2)
A:
2 0 0 2 (temp=1, i=2)

Y vamos a otro ciclo del bucle.


La primera parte, as casi lo mismo, pero al revés. Por cada casilla no-vacía desde la izquierda, buscamos la siguiente no-vacía. Si el número de la siguiente es el mismo (se pueden sumar), los sumamos, y eliminamos uno de ellos (el primero en este caso). Luego, cogemos el siguiente número, y repetimos.
En este código, temp guarda -1 mientras no se encuentra ningún número diferente de 0. Cuando encontramos uno, guardamos su posición en temp. Luego, al encontrar un segundo, comprobamos lo dicho anteriormente. En caso de que no sean iguales, establecemos temp a este último valor, y continuamos. Si son iguales, se suman, y temp lo volvemos a establecer a -1, hasta que encontremos el siguiente valor no-vacío.

Código
  1.    #include <iostream>
  2.  
  3.    int main(){
  4.     int arr[4] = {0,1,1,2};
  5.     int temp = -1;
  6.  
  7.     for(int i=0; i<4; i++){ // SUMAMOS LOS NÚMEROS IGUALES CONSECUTIVOS
  8.     if(temp!=-1){
  9.     if(arr[temp]==arr[i]){ // Encontrados dos consecutivos iguales
  10.     arr[temp] = 0; // Eliminamos uno
  11.     arr[i] *= 2; // Duplicamos el otro
  12.     temp = -1;
  13.     }else{
  14.     temp = i; // Si no son iguales, cogemos el último
  15.     }
  16.     }else if(arr[i]!=0){
  17.     temp = i;
  18.     }
  19.     }
  20.  
  21.     for(temp=0; temp<4; temp++) // AÑADIDO: Colocamos 'temp' al primer número no-vacío
  22.                if(arr[temp]!=0)
  23.                        break;
  24.        // AÑADIDO: 'i' empieza siendo uno más que 'temp'
  25.     for(int i=temp+1; i<4; i++) // COLOCAMOS TODOS LOS NÚMEROS AL PRINCIPIO
  26.     if(arr[i]!=0){
  27.     arr[temp++] = arr[i];
  28.     arr[i] = 0;
  29.     }
  30.  
  31.     for(int i=0; i<4; i++)
  32.     std::cout << arr[i] << " ";
  33.    }

Espero que lo entiendas así jaja
Si no, dime sin problema
En línea

Sr_Malweriks

Desconectado Desconectado

Mensajes: 41



Ver Perfil
Re: Duda sobre vectores!
« Respuesta #5 en: 4 Enero 2016, 23:11 pm »

Genial!, lo probé y me funcionó correctamente :D

Gracias crack!
En línea

"Mientras tu duermes, hay otra persona en otro lugar del planeta trabajando para ser mejor en lo que tu quieres llegar a ser"
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ejercicios sobre operaciones con vectores en programacion C++
Ejercicios
aniyak 1 10,735 Último mensaje 9 Noviembre 2010, 03:15 am
por leogtz
Consulta sobre declaración de vectores
Programación C/C++
Orubatosu 3 2,329 Último mensaje 23 Noviembre 2014, 11:59 am
por Orubatosu
Duda/Error sobre arrays (vectores)
Programación C/C++
Ikuza 1 1,902 Último mensaje 2 Diciembre 2015, 15:03 pm
por class_OpenGL
tengo una una pequeña duda, sobre vectores
Programación C/C++
Emily 4 3,951 Último mensaje 19 Enero 2022, 22:12 pm
por K-YreX
Tengo una duda sobre los punteros, trabajar con archivos, arrays y vectores. En c+++
Programación C/C++
DarkSun812 9 6,605 Último mensaje 23 Marzo 2022, 20:31 pm
por RayR
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines