![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 24.04.2008
Сообщений: 440
|
![]() ![]() res[i,j]:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j])); первые 2 точки у меня соединяются если между ними минимальное расстояние, последущие точки соединяются от этих 2 точек к любой точке которая ближе к этим 2 точкам по расстоянию, потом от 3-х точек до другой по миним. растоянию и так до последней, но надо сделать так чтоб не было цикла ) -------------------------------------------------------------------------- код написал по соединению 2-х мин точек а все остальные не получается как то ![]() -------------------------------------------------------------------------- min:=3; for i:=0 to 19 do begin for j:=i to 19 do begin if i<>j then begin res[i,j]:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j])); memo1.Lines.Add(inttostr(i+1)+','+i nttostr(j+1)+')'+floattostr(res[i,j])); if res[i,j]<min then begin min:=res[i,j]; p1:=i; p2:=j; end; end; end; end; memo2.Lines.Add(inttostr(p1+1)+','+ inttostr(p2+1)+')'+floattostr(min)+ '**'+floattostr(x[p1])+'**'+floattostr(x[p2])); moveto(round(x[p1]*350)+otstup+10,400-10-round(y[p1]*350)); lineto(round(x[p2]*350)+otstup+10,400-10-round(y[p2]*350)); ___________________________________ _________________________ неправильный код ![]() ___________________________________ _________________________ for p1:=i to 19 do begin for p2:=j to 19 do begin if (p1<>p2) and (res[i,j]<min) then begin min:=res[i,j]; l1:=p1; l2:=p2; moveto(round(x[p1]*350)+otstup+10,400-10-round(y[p2]*350)); lineto(round(x[p1]*350)+otstup+10,400-10-round(y[p2]*350)); end; end; end;
1 старый программист, лучше новых 2-х
|
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,542
|
![]()
добавть z[i]
=true точка имеющая соединения =false еще не соединеная точка и условие расчета./проверки раccтояний if z[i] and not z[j] //то есть первая точка дожна быть из списка соединенных а вторая из неприсоединенных
программа — запись алгоритма на языке понятном транслятору
|
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 24.04.2008
Сообщений: 440
|
![]()
я чет с координатами путаюсь чет ни как не получаестся наверное я где то неправильно опять написал (
1 старый программист, лучше новых 2-х
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,542
|
![]()
// заполнить массив я все точки неиспользованы
for p1:=1 to n do z[p1]:=false; for x:=1 to n do begin minres:=1000000; //заведомо большое расстояние for p1:=1 to n begin for p2:=p1+1 to n // p2>p1 begin if z[p1]<>z[p2] // точки имеют разный статус (оединенная и нет) or (x=1) //особый первый случай когда все точки несоединенные then begin r:=res(p1,p2); // расчет расстояния if r<minres then //проверка минимальности begin minres:=r; t1:=p1; t2:=r2; end; end; end; end; // вывод результата и фиксация соединения точек s:=format('t1=%d t2=%d res=%f ', [t1,t2,res]]); memo1,lines.add(s); z[t1]:=true; z[t2]:=true; end;
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 25.04.2008 в 23:18. |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 24.04.2008
Сообщений: 440
|
![]()
Ок огромное спасибо попробую если не получится напишу
![]()
1 старый программист, лучше новых 2-х
|
![]() |
![]() |
![]() |
#6 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]()
А если так:
Строим матрицу расстояний res как у Вас в примере. Дальше работаем только с частью этой матрицы над главной диагональю. Ищем минимальный элемент. Соединяем две точки [i, j] этого элемента, в сам элемент записываем maxInt как признак того, что точки использованы. Дальше рекурсия. Есть две точки. Для каждой ищем минимальное расстояние (по столбцам и строкам матрицы для этих точек). Делаем соединение с новой точкой, помечаем ее использованной (maxInt). Теперь она крайняя и у нас снова две точки. Здесь рекурсивный вызов. Рекурсия заканчивается, когда все элементы выше главной диагонали будут maxInt. |
![]() |
![]() |
![]() |
#7 | |
Форумчанин
Регистрация: 24.04.2008
Сообщений: 440
|
![]() Цитата:
![]()
1 старый программист, лучше новых 2-х
|
|
![]() |
![]() |
![]() |
#8 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]()
Надеюсь, это поможет:
Код:
|
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 24.04.2008
Сообщений: 440
|
![]()
ыыы
![]()
1 старый программист, лучше новых 2-х
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Дерево | MAcK | Общие вопросы Delphi | 7 | 13.06.2008 17:30 |
Дерево | Rifler | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 06.05.2008 08:42 |
Дерево | Yoger | БД в Delphi | 3 | 25.01.2007 01:24 |