По заданному набору доминошек определите, сколько пар «дружных доминошек» можно составить из него - Pascal ABC
Формулировка задачи:
Проводя генеральную уборку на дачном чердаке, Саша нашел в комоде кучу доминошек из разных наборов. Каждая доминошка представляет собой прямоугольник, разделенный на две половинки. На каждой из половинок нарисовано от 0 до 6 точек. Ориентации доминошки не имеют — их можно как угодно поворачивать. В совсем раннем детстве Саша видел, как играют в домино: суть игры заключается в том, что надо брать доминошку и как можно громче колотить ею об стол, крича при этом «рыба!». Услышав доносящийся с чердака грохот, наверх поднялся Сашин дедушка. Он смог объяснить Саше настоящие правила игры в домино: игроки составляют длинную цепочку, в которой соседние доминошки касаются половинками с одинаковым числом точек. Саше решил называть «дружными доминошками» пару доминошек, которые можно поставить в игре рядом (т.е. доминошки в паре соприкасаются половинками с равными числами) в том или ином порядке. Играть в домино ему не с кем, поэтому Саша развлекается тем, что всевозможными способами составляет пары и считает количество «дружных доминошек». По заданному набору доминошек определите, сколько пар «дружных доминошек» можно составить из него. Пары, отличающиеся хотя бы одной доминошкой, считаются различными. По-разному составленная пара из одних и тех же доминошек считается один раз.
Формат входного файла
В первой строке входного файла содержится натуральное число N — количество доминошек
(1 < N < 40 000).
В каждой из последующих строк содержится описание доминошки: два целых числа X и Y
(0 < X, Y < 6) — количество точек на каждой из половинок доминошки.
Формат выходного файла
Выведите одно число — количество пар дружных доминошек.
Задачу нужно решить методом динамического программирования.
Решение задачи: «По заданному набору доминошек определите, сколько пар «дружных доминошек» можно составить из него»
textual
Листинг программы
var a:array[1..40000,1..2] of byte; f:text; n,i,j,k:integer; begin assign(f,'input.txt'); reset(f); read(f,n); for i:=1 to n do read(f,a[i,1],a[i,2]); close(f); k:=0; for i:=1 to n-1 do for j:=i+1 to n do if(a[i,1]=a[j,1])or(a[i,1]=a[j,2]) or(a[i,2]=a[j,1])or(a[i,2]=a[j,2])then inc(k); assign(f,'output.txt'); rewrite(f); write(f,k); close(f); end.
Объяснение кода листинга программы
Этот код написан на языке Pascal ABC и выполняет следующие действия:
- Создает массив
aразмером 40000x2, и инициализирует его значениями типа byte. - Выводит сообщение
input.txtв переменнуюf. - Считывает число
nиз файлаf. - Для каждого
iот 1 доnсчитывает значенияa[i,1]иa[i,2]из файлаf. - Устанавливает переменную
kравной 0. - Для каждой пары
iиjот 1 доn-1проверяет, являются ли значенияa[i,1]иa[j,1]одинаковыми, или значенияa[i,2]иa[j,2]одинаковыми. Если это так, то увеличивает значениеkна 1. - Выводит сообщение
output.txtв переменнуюf. - Перезаписывает файл
fс именемoutput.txt. - Закрывает файл
f.