Задача "Мусор" - Pascal

Узнай цену своей работы

Формулировка задачи:

Добрый день, подскажите пожалуйста как решается данная задача. Думаю уже несколько дней как её решить, но ничего не приходит на ум. Заранее благодарна за отклик! Мусор, состоящий из маленьких прямолинейных палочек, был разбросан по картинке, которая была просто нарисована, и краска на ней еще не высохла. Специальную липкую бумагу можно использовать для удаления мусора. Однако она не позволяет удалять палку, когда она лежит под другой палкой. И, кроме того, липкую бумагу, можно использовать только один раз. Необходимо выяснить, можно ли удалить весь мусор, который лежит на картинке. Дано количество разбросанных палочек и координаты обоих концов каждой палки. В одной точке можно пересечь не более двух палочек. Начало координатных осей расположено в центре изображения.

Ввод:

первая строка ввода содержит количество тестов. Для каждого тестового примера первая строка содержит количество сегментов (n≤32767). Каждая следующая строка содержит четыре действительных числа – координату концов палочек x1, y1, x2, y2, которые разделены пробелами. Все данные в файле верны.

Вывод:

для каждого тестового примера программа должна печатать в стандартный вывод в отдельной строке ДА – в случае, когда картинка будет очищена, и НЕТ – в противном случае.

Решение задачи: «Задача "Мусор"»

textual
Листинг программы
program musor;
type otr=record
             x1,y1,x2,y2:real;
            end;
function peres(o1,o2:otr):boolean;
var k1, k2, k3, k4: real;
begin
k1 := (o2.x2 - o2.x1) * (o1.y1 - o2.y1) - (o2.y2 - o2.y1) * (o1.x1 - o2.x1);
k2 := (o2.x2 - o2.x1) * (o1.y2 - o2.y1) - (o2.y2 - o2.y1) * (o1.x2 - o2.x1);
k3 := (o1.x2 - o1.x1) * (o1.y1 - o1.y1) - (o1.y2 - o1.y1) * (o2.x1 - o1.x1);
k4 := (o1.x2 - o1.x1) * (o1.y2 - o1.y1) - (o1.y2 - o1.y1) * (o2.x2 - o1.x1); 
peres := (k1 * k2 <= 0) and (k3 * k4 <= 0);
end;
var a:array[1..32767] of otr;
    t,n,i,j,k,p:integer;
begin
read(t);//читаем количество тестов
for j:=1 to t do
 begin
  read(n); //читаем количество отрезков в тесте
  for i:=1 to n do read(a[i].x1,a[i].y1,a[i].x2,a[i].y2);
  k:=0;
  i:=1;
  while(i<n)and(k=0) do
   begin
    p:=i+1;
    while(p<=n)and(k=0) do
    if peres(a[i],a[p]) then k:=1;
    if k=0 then inc(i);
   end;
  if k=0 then write('Да') else write('Нет');
 end;
end.

Объяснение кода листинга программы

  1. Ввод количества тестов и количества отрезков в тесте
  2. Чтение координат отрезков
  3. Создание переменной k для отслеживания пересечений
  4. Перебор отрезков в текущем тесте
  5. Проверка пересечения текущего отрезка с каждым последующим
  6. Если пересечение найдено, увеличиваем k и запоминаем пересеченный отрезок
  7. Если после прохода по всем отрезкам k=0, то пишем Да, иначе пишем Нет

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.8 из 5