|
Вопрос # 3 591/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
N точек заданы своми координатами на площине: массив X[i]- абсциссы точек, массив Y[i]- ординаты. Найти 2 точки расстояние между которыми наибольшее.
Помогите решить. Заранее большое спасибо!
 |
Вопрос задал: LDO (статус: Посетитель)
Вопрос отправлен: 27 декабря 2009, 18:11
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
А вот:
type
TVector = array[0..n - 1] of Single; // Тип массива точек
function GetLength(const X, Y: Single): Single;
begin
Result:= Sqrt(Sqr(X) + Sqr(Y));
end;
var
X, Y: TVector;
i, j: Integer;
L, Max: Single;
begin
for i:= 0 to n - 1 do
begin
// <--- заполнение массивов
X[i]:= Random(100);
Y[i]:= Random(100);
end;
// Поиск максимального расстояния
Max:= 0.0;
for i:= 0 to n - 1 do
for j:= 0 to n - 1 do
begin
L:= GetLength(X[i], Y[i]);
if L > Max
then Max:= L;
end;
// Вывод максимального расстояния
WriteLn(' Max = ', Max: 3: 3);
ReadLn;
end;
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 27 декабря 2009, 19:12
|
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 27 декабря 2009, 21:32; участников в обсуждении: 3.
|
Валя (статус: 1-ый класс), 27 декабря 2009, 18:58 [#1]:
Вероятнее всего необходимо попарно сравнивать координаты всех точек.
maxlen:=0;
for i:=0 to n-1 do
for j:=i+1 to n do
if sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]))>maxlen then begin
maxlen:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));
t1:=i;
t2:=j;
end;
|
|
Егор (статус: 10-ый класс), 27 декабря 2009, 19:55 [#2]:
мужики, нафиг вы корни извлекаете? проще надо быть, проще:
...
if sqr(x[i]-x[j])+sqr(y[i]-y[j])>maxlen then...
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Ерёмин А.А. (статус: *Администратор), 27 декабря 2009, 21:32 [#3]:
Цитата (min@y™):
function GetLength(const X, Y: Single): Single;
begin
Result:= Sqrt(Sqr(X) + Sqr(Y));
end;
Здесь явно ошибка, т.к. считается расстояние от начала координат. Хотя автор и сам переделает (надеюсь).
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|