• 4. Конное путешествие
    Ограничение времени 3 секунды
    Ограничение памяти 256Mb
    Ввод horse.in
    Вывод horse.out
    Территория далёкой страны Чессляндии представляет собой объединение прямоугольников, расположенных на клетчатой плоскости с вершинами в узлах целочисленной решётки. Прямоугольники могут пересекаться и даже совпадать. В Чессляндии могут присутствовать острова и анклавы - территории, не связанные непрерывным путём по соседним клеткам с другими частями страны. Житель Чессляндии - благородный рыцарь - в поисках приключений решил совершить конное путешествие из города А в город Б. Его конь, естественно, может ходить только по правилам шахматного коня (т.е. за один ход может совершить перемещение на 2 клетки по горизонтали или вертикали в любом направлении и одновременно на одну клетку в перпендикулярном направлении). Конь может пересекать границу Чессляндии в процессе хода, но не может завершать ход вне территории Чессляндии, так как путешественник не собирается заниматься оформлением заграничных виз. Чтобы спланировать своё путешествие рыцарь хочет понять, сможет ли он на коне добраться до пункта назначения, и если сможет - сколько времени у него займёт дорога. Помогите ему в этом: напишите программу, решающую данную задачу.

    Формат ввода
    В первой строке входного файла записано единственное целое число n - количество прямоугольников, образующих территорию Чессляндии. В следующих n строках записаны по 4 целых числа через пробел: xi1, yi1, xi2, yi2 - координаты левой нижней и правой верхней клетки i-го прямоугольника соответственно (xi1, yi1 - номер столбца и номер строки левой нижней клетки прямоугольника, xi2, yi2 - номер столбца и номер строки правой верхней клетки прямоугольника, столбцы нумеруются слева направо, строки нумеруются снизу вверх), 0 ≤ xi1, yi1, xi2, yi2 < M, 0 ≤ xi2 - xi1 < m, 0 ≤ yi2 - yi1 < m. В (n+2)-ой строке также через пробел записаны 2 целых числа - координаты клетки, в которой расположен город А, в (n+3)-ей строке аналогично записаны координаты клетки, в которой расположен город Б. Ограничения на величины определяются подзадачей. Гарантируется, что клетки городов А и Б не совпадают и находятся на территории Чессляндии.

    Формат вывода
    В единственной строке выходного файла необходимо вывести одно целое число: минимальное количество ходов, которое требуется коню, чтобы добраться из города А в город Б. Если добраться невозможно, необходимо вывести число -1.


    Примечания
    Система оценивания: полное решение задачи оценивается в 100 баллов. Частичные решения оцениваются при условии полного решения указанных подзадач.

    Подзадача 1. n = 1, m = M = 10. Балл за подзадачу: 10.

    Подзадача 2. n ≤ 10, m = M = 10. Требуется решённая подзадача 1. Балл за подзадачу: 20.

    Подзадача 3. n ≤ 104, m = 100, M = 104. Требуются решённые подзадачи 1 и 2. Балл за подзадачу: 35.

    Подзадача 4. n ≤ 100, m = M = 109. Дополнительное ограничение: общая площадь Чессляндии не превосходит 106 клеток. Требуются решённые подзадачи 1 и 2. Балл за подзадачу: 35.

Ответы 1

  • program t;

    var n, i, a, b, c, d, k, m: integer; x1, x2, x3, y1, y2, y3: array[1..10000] of integer; f1, f2: text;

    function icl(x, y: integer): boolean;

    var i: integer;

    begin

    icl:=false;

    for i:=1 to n do

    begin

     if (x>=x1[i]) and (y>=y1[i]) and (x<=x2[i]) and (y<=y2[i]) then

     begin

      icl:=true;

      break

     end

    end

    end;

    procedure re(st, fn: integer);

    var nst, nfn, i, j, jj, xx, yy: integer; eq, ff: boolean;

    begin

    m:=m+1;

    nst:=k+1;

    ff:=false;

    for i:=st to fn do

    begin

     for j:=0 to 11 do

     begin

      if j mod 3=0 then continue;

      xx:=x3[i]+trunc(cos(j*pi/6)*3);

      yy:=y3[i]+trunc(sin(j*pi/6)*3);

      if not icl(xx, yy) then continue;

      eq:=false;

      for jj:=1 to k do if (xx=x3[jj]) and (yy=y3[jj]) then

      begin

       eq:=true;

       break

      end;

      if eq then continue;

      if (xx=c) and (yy=d) then

      begin

       ff:=true;

       break

      end;

      k:=k+1;

      x3[k]:=xx;

      y3[k]:=yy;

     end;

     if ff then break;

    end;

    if ff then exit;

    nfn:=k;

    if nst>nfn then

    begin

     m:=-1;

     exit

    end;

    re(nst, nfn)

    end;

    begin

    assign(f1, 'horse.in');

    reset(f1);

    assign(f2, 'horse.out');

    rewrite(f2);

    readln(f1, n);

    for i:=1 to n do readln(f1, x1[i], y1[i], x2[i], y2[i]);

    readln(f1, a, b);

    readln(f1, c, d);

    k:=1;

    x3[1]:=a;

    y3[1]:=b;

    m:=0;

    re(1, 1);

    writeln(f2, m);

    close(f1);

    close(f2)

    end.

    • Автор:

      bella75
    • 6 лет назад
    • 0
  • Добавить свой ответ

Еще вопросы

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years