TStates = array ['A'..'Z'] of TBoundSet;
{ Процедура чтения множества чисел (границ) из строки файла }
procedure ReadSet(var aFile: text; var aSet : TBoundSet);
var k : integer;
begin
while not Eoln(aFile) do begin
Read(aFile, k);
aSet:= aSet+[k];
end;
Readln (aFile);
end;
{ Глобальные переменные }
var FileIn : text; { Входной файл, полученный со спутника }
States : TStates; { Массив множеств границ }
Names : TNameSet; { Множество имен всех стран на карте }
C1, C2 : char; { Имена стран "откуда" и "куда" }
C : char; { Рабочая переменная для имен стран }
EmpireB: TBoundSet; { Границы империи }
Temp : TBoundSet; { Предыдущие границы империи }
EmpireN: TNameSet; { страны империи }
Counter: integer; { Счетчик пересечений границ (результат) }
begin {--- Главная программа ---}
{ Открываем входной файл }
Assign(FileIn, 'P_38_3.in'); Reset(FileIn);
{ Готовим цикл чтения массива множеств }
Names:=[ ]; { Названия стран }
C:= 'A'; { Первый индекс в массиве стран }
while not Eof(FileIn) do begin { Цикл чтения массива множеств }
ReadSet(FileIn, States[C]); { Чтение одного множества }
Names:= Names+[C]; { Добавляем имя страны }
end;
Close(FileIn); { Теперь входной файл можно закрыть }
repeat { «Упрямый» цикл чтения правильных имен стран }
Write('Откуда: '); Readln(C1);
Write('Куда : '); Readln(C2);
{ Переводим имена стран в верхний регистр }
C1:= UpCase(C1); C2:= UpCase(C2);
{ Если имена не совпадают и оба достоверны, значит ввод правильный,
в таком случае выходим из цикла, а иначе повторяем ввод }
if (C1<>C2) and (C1 in Names) and (C2 in Names)
then Break
else Writeln('Ошибка! Повторите ввод имен стран');
until False;
{ Подготовка к присоединению стран }
EmpireB:= States[C1]; { Империя начинает расширяться от страны C1 }
EmpireN:= [C1]; { Здесь накапливаются имена присоединенных стран }
Counter:= 0; { Счетчик "завоевательных кампаний" }
{ Цикл, пока не будет присоединена страна C2 }
repeat
{ Подготовка к "завоевательной кампании" }
C:='A'; { Первый индекс в массиве множеств границ }
{ Цикл очередной "завоевательной кампании" по всем странам массива }
while C in Names do begin
{ Если страна имеет общую границу, присоединяем её к империи }
if (Temp * States[C]) <> [] then begin
EmpireB:= EmpireB + States[C]; { Добавляем границы }
EmpireN:= EmpireN + [C]; { Добавляем имя страны }
end;
C:=