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 2A:
0 0 2 2En 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 0La 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.
#include <iostream>
int main(){
int arr[4] = {0,1,1,2};
int temp = -1;
for(int i=0; i<4; i++){ // SUMAMOS LOS NÚMEROS IGUALES CONSECUTIVOS
if(temp!=-1){
if(arr[temp]==arr[i]){ // Encontrados dos consecutivos iguales
arr[temp] = 0; // Eliminamos uno
arr[i] *= 2; // Duplicamos el otro
temp = -1;
}else{
temp = i; // Si no son iguales, cogemos el último
}
}else if(arr[i]!=0){
temp = i;
}
}
for(temp=0; temp<4; temp++) // AÑADIDO: Colocamos 'temp' al primer número no-vacío
if(arr[temp]!=0)
break;
// AÑADIDO: 'i' empieza siendo uno más que 'temp'
for(int i=temp+1; i<4; i++) // COLOCAMOS TODOS LOS NÚMEROS AL PRINCIPIO
if(arr[i]!=0){
arr[temp++] = arr[i];
arr[i] = 0;
}
for(int i=0; i<4; i++)
std::cout << arr[i] << " ";
}
Espero que lo entiendas así jaja
Si no, dime sin problema