Помощь - Поиск - Пользователи - Календарь
Полная версия: Равнобедренные треугольники.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
DarkWishmaster
Вообщем дано N точек и их координаты:
Например:
N:=4
0 0
2 2
-2 2
2 -2 Сколько равнобедренных треугольников получатся если их соеденить?
Я попробовал так:
берем 1 точку и 2, мерим растояние(D), потом идём по другим точкам и мерим растояние от 1 до каждой точки, если совподает с (D) то inc(Count);
Потом 1 точка и 3 точка, мерим растояние и. т
Потом уже 2 и 3 точка, и.т
Всё равно бред получается, может у вас есть какие нибудь идеи.
  File  Edit  Search  Run  Compile  Debug  Tools  Options  Window  Help

║writeln(N);
║for i:=1 to N do
║ writeln(x[i],',',y[i]);
║ i:=0;
║ while i<N-2 do begin
║ inc(i); k:=0;
║ while k<N-2 do begin
║ inc(k); j:=0;

║ dx:=abs(x[i]-x[i+k]);
║ dy:=abs(y[i]-y[i+k]);
║ while j<N-k-i do begin
║ inc(j);
║ if (dx=abs(x[i]-x[i+k+j]))
║ and (dy=abs(y[i]-y[i+k+j])) then
║ inc(M);
║ end;
║ end;
║ end;

volvo
Вот ключ к решению: Операции над векторами
DarkWishmaster
Цитата(volvo @ 10.02.2011 22:22) *

Вот ключ к решению: Операции над векторами



║ for i:=1 to n-2 do
║ for j:=i+1 to n-1 do

║ for k:=j+1 to n do
║ begin
║ D1:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));
║ D2:=sqrt(sqr(x[j]-x[k])+sqr(y[j]-y[k]));
║ D3:=sqrt(sqr(x[k]-x[i])+sqr(y[k]-y[i]));
║ if (Compar(D1,D2)=True)
║ or (COmpar(D2,D3)=True)
║ or (COmpar(D1,D3)=True) then inc(M);


║ end;


║ writeln(M);
║ write(F, M); close(F);
║readkey;
║end.



Такая проблема, если поставить точки на одной прямой, на равные растояние, то ответ будет будет больше нуля, хотя должен быть 0.
Lapp
Цитата(DarkWishmaster @ 18.02.2011 20:55) *
Такая проблема, если поставить точки на одной прямой, на равные растояние, то ответ будет будет больше нуля, хотя должен быть 0.
А почему это он должен быть 0?
Выбираем точки 1, 2, 3 на оси Х, соединяем. Получаем равнобедренный треугольник (стороны [1,2] и [2,3] - равны)..
Где я ошибся?
-TarasBer-
> File Edit Search Run Compile Debug Tools Options Window Help

Ты что, из консоли что ли копируешь?
Теперь я понял, откуда 2 чёрточки в начале каждой строчки.
Просто сохрани файл, а потом правой кнопкой по нему - открыть с помощью - блокнот. И из него нормально копируй.

> D1:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));
> D2:=sqrt(sqr(x[j]-x[k])+sqr(y[j]-y[k]));
> D3:=sqrt(sqr(x[k]-x[i])+sqr(y[k]-y[i]));

Для того, чтобы просто сравнивать расстояния, не надо извлекаться корень.
Только учти, что тут тебе может не хватить размера типа integer и придётся перейти на longint.
DarkWishmaster
Цитата(-TarasBer- @ 19.02.2011 12:58) *

> File Edit Search Run Compile Debug Tools Options Window Help

Ты что, из консоли что ли копируешь?
Теперь я понял, откуда 2 чёрточки в начале каждой строчки.
Просто сохрани файл, а потом правой кнопкой по нему - открыть с помощью - блокнот. И из него нормально копируй.

> D1:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));
> D2:=sqrt(sqr(x[j]-x[k])+sqr(y[j]-y[k]));
> D3:=sqrt(sqr(x[k]-x[i])+sqr(y[k]-y[i]));

Для того, чтобы просто сравнивать расстояния, не надо извлекаться корень.
Только учти, что тут тебе может не хватить размера типа integer и придётся перейти на longint.


О, спасибо! Я и в правду копировал Prt Scrn из паскаля.


Lapp, Вот соединяем, получаем линию AB.
З.Ы За русский извиняюсь, не мой родной язык, но если найдёте ошибки, буду рад исправить.
volvo
Повторяю вопрос Lapp-а: что заставляет тебя НЕ считать AOB равнобедренным треугольником?
DarkWishmaster
Цитата(volvo @ 19.02.2011 18:55) *

Повторяю вопрос Lapp-а: что заставляет тебя НЕ считать AOB равнобедренным треугольником?

Наверно потому что у АОВ нету 3 углов. Но википедия подсказала что "он называется вырожденным." так что извините, спасибо!
Lapp
Цитата(DarkWishmaster @ 19.02.2011 20:13) *
Наверно потому что у АОВ нету 3 углов. Но википедия подсказала что "он называется вырожденным." так что извините, спасибо!
Тот случай, когда программа оказалась умнее своего создателя )). Кстати, не такой уж и редкий на самом деле, у меня так бывало не раз.

(volvo, спасибо))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.