Периметр выпилленой части шахматной доски (Pascal)

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 2 нед., 3 дн. назад.

  • Автор
    Сообщения
  • #5592
    @admin

    Из шахматной доски по границам клеток выпилили связную (очевидно, связанную) (не распадающуюся на части) фигуру без дыр. Требуется определить её периметр.

    Формат выходных данных

    Сначала вводится число N (1≤N≤64) — количество выпиленных клеток. В следующих N строках вводятся координаты выпиленных клеток, разделенные пробелом (номер строки и столбца — числа от 1 до 8). Каждая выпиленная клетка указывается один раз.

    Формат выходных данных

    Выведите одно число — периметр выпиленной фигуры (сторона клетки равна единице).

    Примеры

    Входные данные Выходные данные Комментарий
    3
    1 1
    1 2
    2 1
    8 Вырезан уголок из трех клеток. Сумма длин его сторон равна 8
    1
    8 8
    4 Вырезана одна клетка. Её периметр равен 4

    Решение

    Периметры ВСЕХ вырезанных клеток равны 4*N. Если из этого числа вычесть число общих границ клеток умноженное на 2, то мы получим искомый периметр.

    Примем двумерный массив 8х8 за шахматную доску. Введенные клетки обозначим единицами. Общие границы клеток определим, просматривая клетки массива по вертикали и по горизонтали.

    program One_3;
    
    uses
      CRT;
    
    const
      m = 8;
    var
      x: array[1..m, 1..m] of integer;
      p, i, j, n, k: integer;
    begin
      ClrScr;
      readln(n); {ввод числа клеток}
      {ввод координат клеток}
      for k := 1 to n do
      begin
        write(k, ' ');
        readln(i, j);
        x[i, j] := 1; {заполнение введенных ячеек массива единицами}
      end;
      p := 4 * n;
      {просмотр массива по горизонтали}
      for i := 1 to m do
        for j := 1 to m - 1 do
          if (x[i, j] = 1) and (x[i, j + 1] = 1) then
            p := p - 2;
      {просмотр массива по вертикали}
      for j := 1 to m do
        for i := 1 to m - 1 do
          if (x[i, j] = 1) and (x[i + 1, j] = 1) then
            p := p - 2;
      writeln(p); {вывод результата}
      readln;
    end.

Для ответа в этой теме необходимо авторизоваться.