Разбор задачи A. Летопись
Тема: перестановки, техника программирования, разбор случаев
Сложность: ниже среднего
Необходимо рассмотреть `3!\ =\ 6` перестановок 3 чисел в дате и выбрать из них те варианты, которые соответствуют реальной дате.
При проверке нужно учитывать, что 2100 год является невисокосным.
uses sysutils;
const mday:array[1..12] of integer=(31,28,31,30,31,30,31,31,30,31,30,31);
var s,a,b,c:string;
dates:array[1..6] of string;
k,i:integer;
procedure check(ds,ms,ys:string);
var d,m,y,i:integer;
fl:boolean;
newdate:string;
begin
d:=strtoint(ds); { Переводим из строк в целые числа }
m:=strtoint(ms); { Функция strtoint определена в стандартном модуле sysutils }
y:=strtoint(ys);
if (m>=1) and (m<=12) and (d>=1) and (d<=mday[m]) or { обычная дата или }
(y>0) and (y mod 4=0) and (m=2) and (d=29) then { 29 февраля високосного года }
begin
newdate:=ds+'/'+ms+'/'+ys;
fl:=true; { Проверяем на дубли }
for i:=1 to k do
if newdate=dates[i] then
fl:=false;
if fl then { Дата не дублируется }
begin { добавляем её в массив dates }
inc(k);
dates[k]:=newdate;
end;
end;
end;
begin
readln(s);
a:=copy(s,1,2); { Выделяем числа }
b:=copy(s,4,2);
c:=copy(s,7,2);
k:=0;
check(a,b,c); { 6 перестановок }
check(a,c,b);
check(b,a,c);
check(b,c,a);
check(c,a,b);
check(c,b,a);
if k=0 then
writeln('No such date')
else
for i:=1 to k do
writeln(dates[i]);
end.