Задача про линию шариков (удаление со сдвигом 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.
Объяснение кода листинга программы
- В первой строке определяется тип программы как консольная и используемые библиотеки.
- Задается максимальное значение для переменной
nmax
, которая будет использоваться для определения размера массива. - Создается массив
a
типаinteger
размеромnmax
. - Определяются переменные
n
,i
,j
,p
,s
,q
,ud
иf
типаinteger
. - Переменная
ud
инициализируется значением 0. - С помощью функции
readln
в цикл считывается количество шариков (значение переменнойn
) и заполняется массивa
значениями, считанными в цикле. - Выводится горизонтальная строка для разделения начального и конечного состояния массива.
- Инициализируется флаг
f
значениемfalse
. - В повторяющемся цикле (пока
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.
- Переменная
- Переменная
- После завершения цикла выводится значение переменной
ud
. - Программа ожидает ввода данных с помощью функции
readln
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д