Задача про линию шариков (удаление со сдвигом 3х и более одинаковых подряд идущих) - Free Pascal

Узнай цену своей работы

Формулировка задачи:

В одной компьютерной игре игрок выставляет в линию шарики разных цветов. Когда образуется непрерывная цепочка из трех и более шариков одного цвета, она удаляется из линии. Все шарики при этом сдвигаются друг к другу, и ситуация может повториться. Напишите программу, которая по данной ситуации определяет, сколько шариков будет сейчас уничтожено. Естественно, непрерывных цепочек из трех и более одноцветных шаров в начальный может быть не более одной. Формат входного файла Даны количество шариков в цепочке (не более 1000) и цвета шариков (от 0 до 9, каждому цвету соответствует свое целое число). Формат выходного файла Требуется вывести количество шариков, которое будет уничтожено. Пример: ввод: 10 3 3 2 1 1 1 2 2 3 3 вывод: 10

Решение задачи: «Задача про линию шариков (удаление со сдвигом 3х и более одинаковых подряд идущих)»

textual
Листинг программы
program Project2;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
const nmax=1000;
var a:array[1..nmax] of integer;
    n,i,j,p,s,q,ud:integer;
    f:boolean;
begin
ud:=0;
readln(n);
for i:=1 to n do readln(a[i]);
writeln;
f:=false;
repeat
i:=2;
while i<=n do
if a[i]=a[i-1] then
 begin
  j:=i;
  s:=1;
  p:=i-1;
  while(j<=n) and(a[j]=a[j-1]) do
   begin
    s:=s+1;
    j:=j+1;
   end;
  if s>2 then
   begin
    ud:=ud+s;
    f:=true;
    for j:=1 to s do
     begin
      for q:=p to n-1 do
      a[q]:=a[q+1];
      n:=n-1;
     end
   end
  else i:=i+1;
 end
else i:=i+1;
until(n<3)or not f;
writeln(ud);
readln
end.

Объяснение кода листинга программы

  1. В первой строке определяется тип программы как консольная и используемые библиотеки.
  2. Задается максимальное значение для переменной nmax, которая будет использоваться для определения размера массива.
  3. Создается массив a типа integer размером nmax.
  4. Определяются переменные n, i, j, p, s, q, ud и f типа integer.
  5. Переменная ud инициализируется значением 0.
  6. С помощью функции readln в цикл считывается количество шариков (значение переменной n) и заполняется массив a значениями, считанными в цикле.
  7. Выводится горизонтальная строка для разделения начального и конечного состояния массива.
  8. Инициализируется флаг f значением false.
  9. В повторяющемся цикле (пока n больше 2) выполняется следующая последовательность действий:
    • Переменная i устанавливается равной 2.
    • В цикле проверяется, являются ли три последовательных элемента массива одинаковыми.
    • Если это так, то выполняется следующая последовательность действий:
      • Переменная j устанавливается равной i.
      • Переменная s устанавливается равной 1.
      • Переменная p устанавливается равной i-1.
      • В цикле (пока j меньше n и a[j] равно a[j-1]) выполняется следующая последовательность действий:
        • Переменная s увеличивается на 1.
        • Переменная j увеличивается на 1.
      • Если s больше 2, то выполняется следующая последовательность действий:
        • Значение переменной s добавляется к переменной ud.
        • Флаг f устанавливается в true.
        • В цикле (для каждого шарика в удаляемой последовательности) выполняется следующая последовательность действий:
          • Переменная q устанавливается равной p.
          • Переменная n уменьшается на 1.
          • Значение a[q] присваивается значению a[q+1].
        • Переменная n уменьшается на 1.
      • Если s меньше или равно 2, то переменная i увеличивается на 1.
  10. После завершения цикла выводится значение переменной ud.
  11. Программа ожидает ввода данных с помощью функции readln.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5
Похожие ответы