Предмет: Информатика, автор: fhhhf6

Простая задача
В этой задаче не будет длинного условия и простого решения. Все будет наоборот. Требуется провести непрерывную линию произвольного вида из точки с координатами (x_1,y_1)(x
1

,y
1

) в точку с координатами (x_2,y_2)(x
2

,y
2

) так, чтобы минимизировать количество точек на этой линии, в которых хотя бы одна координата является целым числом. Ответом к задаче будет являться количество таких точек. Если начальная или конечная точка линии будет иметь хотя бы одну целочисленную координату, то ее тоже надо учитывать.

Формат входных данных
Каждый тест в этой задаче будет содержать nn запросов. 1\leq n\leq 1001≤n≤100. Натуральное число nn будет записано в первой строке. Далее в nn строках записаны запросы. Каждый запрос располагается в отдельной строке и состоит из четырех чисел x_1x
1

, y_1y
1

, x_2x
2

, y_2y
2

, которые задают координаты двух точек. Точки не совпадают. Координаты могут быть целыми или вещественными числами не более чем с 2 знаками после точки. Координаты не превосходят 10^910
9
по абсолютной величине. Если координата является целым числом, то ее запись не содержит десятичной точки.

Формат выходных данных
Требуется вывести ответы на запросы по одному ответу в каждой строке.

Методика проверки и пояснение к тесту
Программа проверяется на 10 тестах. Прохождение каждого теста оценивается в 2 балла. Тест из условия задачи при проверке не используется.

Следующие рисунки поясняют ответ к тесту. Обратите внимание, что никакой фрагмент линии не может лежать на сетке, так как в этом случае количество точек с целочисленной координатой будет бесконечно большим.



Sample Input:
2
-2 -0.5 0.5 1.5
0 -2 0 2
Sample Output:
3
5

Ответы

Автор ответа: dubrovskayaalisia
2

Ответ:

#include <iostream>

#include <cmath>

using namespace std;

 

int main()

{ int n, ry, rx;

 double x1, x2, y1,y2 ;

 

 cin >> n;

 int ans[n];

 for(int i = 0; i<n; i++)

    {cin >> x1>> y1>> x2>>y2;

     ry = y2 - y1;

     rx = x2 - x1;

     if (abs(ry) > abs(rx))

       ans[i] = abs(ry) +1 ;

     else

        ans[i] = abs(rx) + 1;

 }

 

 for (int i = 0; i <n; i++)

    cout << ans[i]<<endl;

   return 0;

}

Объяснение:

с++


SHUMANOV00: Напишите по пайтану
DartiNoda: На питоне это решение будет выглядеть примерно так:
DartiNoda: *сейчас напишу
DartiNoda: Хм,а вот незадача,в питоне сложно реализовать штуку ,как ввод в строку и целых и вещественных чисел.И если это ещё можно,до дальнейшее присваивание переменных в питоне невозможно,так что придется на питоне придумывать несколько другое решение
DartiNoda: А цикл человека,который ответил-бесконечный при вводе
Автор ответа: ekre4etov
0

Ответ:

from math import ceil  

num = int(input())

points =[list(map(float, input().split())) for _ in range(num)]

for p in points:

   if abs(p[0] - p[2]) > abs(p[1] - p[3]):

       a, b = p[0], p[2]

   else:

       a, b = p[1], p[3]

   r = ceil(abs(b - a))

   if abs(b - a) == r:

       r += 1

 

   print(r)

Объяснение:

Питон

Похожие вопросы
Предмет: Английский язык, автор: vbn20092001p5rkgx