Задать вопрос
@ffff567

Как это посчитать?

есть список
[4, 2, 2 0]
1. Надо все нули сместить влево [0,4,2,2]
2. если 2 цифры в списке стоят подряд и они одинаковые то сложить их вместе [0,0,4,4]
В списке все ще есть 2 одинаковые цифры сложить их снова [0,0,0,8]

Пишу игру 2048 в оригнальной версии заметил баг поэтому пишу собственную игру.
Баг заключается в том что.
если 2 цифры в списке стоят подряд и они одинаковые то сложить их вместе
получается [0,0,4,4]. и все ход сделан на поле добавляется еще одна цифра. хотя в списке стоят 2 одинаковые их то же нужно сложить. В оригигнальной версии такого нет а по закону физики они тоже должны объдинится. так что оригинальная версия фигня
67d675e15204b050335388.jpeg
  • Вопрос задан
  • 114 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
sergiks
@sergiks Куратор тега Алгоритмы
♬♬
в цикле:
  проверять правила,
  если одно из них привело к изменению, нужно повторить сначала
  если изменений нет — можно выходить из цикла, более считать нечего.

+ сделать предохранитель от бесконечных повторов. Мало ли..
Ответ написан
Комментировать
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Проще всего двигать элементы по одному, справа-налево. Элемент можно сдвинуть, если справа стоит 0 или такой же элемент. Поддерживаем инвариант, что все элементы правее current уже сдвинуты и уплотнены до предела. Двигаем текущий пока можем. Чтобы не было циклов не двигаем нули.
int n = a.size();
int current = n-1;
while (current >= 0) {
    while (a[current] > 0 && current < n-1 && 
          ((a[current+1] == a[current]) || (a[current+1] == 0))) {
      a[current+1] += a[current];
      a[current] = 0;
      ++current;
    }
    --current;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы