Внимание даю 50 балловВ конструкторском бюро проектируют планетоход для исследования...

0 голосов
38 просмотров
Внимание даю 50 баллов
В конструкторском бюро проектируют планетоход для исследования поверхности
планеты Марс. Исследования должны проводиться на прямоугольной области планеты без
препятствий внутри неё. Эта область разделена на единичные квадраты и имеет
размеры M×N, где M – длина прямоугольника, а N – его ширина.
Планируется, что планетоход должен работать по следующей программе. Вначале
он садится в северо-западном углу заданной области в направлении на восток. После
этогопланетоход начинает обход и исследование выбранной области, двигаясь по
спирали почасовой стрелке. При этом спираль постепенно «закручивается» вовнутрь,
захватывая постепенно все клетки прямоугольника. Исследование заканчивается, когда
пройдены всеклетки.
Требуется написать программу, которая для заданных M и N (1≤M, N ≤ 32767)
определяет количество поворотов, которые должен выполнить планетоход в процессе
исследования области.
Описание входных данных
Входные данные вводятся из файла input.txt. В единственной строке этого файла
через пробел записаны два целых числа M и N (1 ≤ M, N ≤ 32767), размеры
исследуемого прямоугольного участка.
Описание выходных данных
Выходные данные выводятся в файл output.txt. В единственной строке этого файла
необходимо вывести одно целое число – количество поворотов, которое выполнит
планетоход при исследовании заданной области на поверхности Марса.

Информатика | 38 просмотров
Дан 1 ответ
0 голосов
Правильный ответ

Рассматривая различные прямоугольники и подсчитывая в них число поворотов P, можно прийти к следующему алгоритму. Для любого натурального k получаем:
P=\begin {cases} 0, \ min(M,N)=1 \\4k-2, \ min(M,N)=2k, \, M=N, \, k \in \mathbb N \\ 4k-1, \ min(M,N)=2k, \, M \neq N, \, k \in \mathbb N \\ 4k, \ min(M,N)=2k+1, \, M=N, \, k \in \mathbb N \\ 4k+1, \ min(M,N)=2k+1, \, M \neq N, \, k \in \mathbb N \\ \end {cases}

var
  M, N, k, mn, P: integer;
  f: Text;

begin
  Assign(f, 'input.txt');
  Reset(f);
  Readln(f, M, N);
  Close(f);
  if M < N then mn := M else mn := N;
  if mn = 1 then P := 0
  else begin
    k := mn div 2;
    if mn mod 2 = 0 then
      if M = N then P := 4 * k - 2
      else P := 4 * k - 1
    else
    if M = N then P := 4 * k
    else P := 4 * k + 1
  end;
  Assign(f, 'output.txt');
  Rewrite(f);
  Writeln(f, P);
  Close(f)
end.



Скачать вложение Текст (TXT)
Скачать вложение Текст (TXT)
(142k баллов)