Подразделы

Другие разделы

Дата и время

16/11/2024 17:15:11

Авторизация

Имя:
Пароль:
Зарегистрироваться
Восстановить пароль
 

printРазбор задачи 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.
loading