Задача про линию шариков (удаление со сдвигом 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д