Задача про линию шариков (удаление со сдвигом 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.