Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Числа. Точки на плоскости.

Автор: zetsokol 28.11.2005 5:43

Вот дали задачи на контрольную. Помогите кто чем может. blink.gif

1. N точек на плоскости заданы своими координатами. Найти порядок, в котором можно соединить эти точки, чтобы получился N-угольник (т.е. не было бы пересечений сторон).

2.Построить алгоритм, выдающий без повторений все перестановки N чисел.

Автор: Altair 28.11.2005 6:04

Цитата
1. N точек на плоскости заданы своими координатами. Найти порядок, в котором можно соединить эти точки, чтобы получился N-угольник (т.е. не было бы пересечений сторон).


wink.gif
Представим множество точек на плоскости.
Прикрепленное изображение
Теперь проведем http://alglib.sources.ru/geometry/triangulatearea.php
Прикрепленное изображение
После этого у нас получилось не что иное как связанный граф.
Создаем для него матрицу смежности например (при этом запоминая, номера вершин какой точке соотвествуют).
После получаем задачу Эйлерова пути в чистом виде:
поиск цепи в графе, которая содержит все вершины и ребра в 1 экземпляре.

http://forum.pascal.net.ru/index.php?showtopic=4030&view=findpost&p=42495

Автор: Altair 28.11.2005 6:08

2. http://forum.pascal.net.ru/index.php?showtopic=4340&view=findpost&p=37181
отуда:

{ программа генерации перестановок N элементного 
множества в лексикографическом порядке }

Program perms;
var i,j,h,n,k:integer;
a:array[0..100] of integer; { массив для хранения перестановки }

{процедура вывода полученной перестановки}
procedure output;
var i:integer;
begin
writeln;
for i:=1 to n do write(a[i],' ');
end;

begin
readln(n); { ввод кол-ва элементов перестановки }
fillchar(a,sizeof(a),0); { инициализация массива }

{ ввод элементов начальной перестановки }
for i:=1 to n do a[i]:=i;

repeat
output; { ввод текущей перестановки }
i:=n;
while a[i-1]>a[i] do dec(i); { поиск скачка }
j:=i-1;
h:=a[j];
while a[i+1]>h do inc(i); { поиск первого меньшего элемента }
a[j]:=a[i]; a[i]:=h;
i:=j+1; k:=n;
while i<k do begin { перестановка ”хвоста” }
h:=a[i]; a[i]:=a[k]; a[k]:=h;
inc(i); dec(k)
end
until j=0; {}
end.


Автор: zetsokol 28.11.2005 6:16

Огромное спасибо good.gif и не спицца тебе в такую пору. Только можно 1 задачу расписать полностью как и вторую и вот еще пару задач. Заранее БЛАГОДАРЕН.


3. В заданной строке определите количество слов, начинающихся и заканчивающихся на одну и ту же букву.

4. Натуральное число N>1 представить в виде суммы натуральных чисел так, чтобы произведение этих слагаемых было максимально.

Автор: Altair 28.11.2005 6:41

Цитата
и не спицца тебе в такую пору

чувства не дают...
Цитата
Только можно 1 задачу расписать полностью

Согласен, интересная задача... только утром smile.gif

Цитата
3. В заданной строке определите количество слов, начинающихся и заканчивающихся на одну и ту же букву.

function SepWord(s:string):integer;
const
r:set of char = [chr(0)..chr(255)]-['A'..'Z','a'..'z','1'..'9','0'];
var
i:integer; SL:boolean; ss:string;
pl:integer;
begin
sl:=false; ss:='' ; i:=1; pl:=0;
while i<=length(s) do begin
if ((not(s[i] in r)) and (sl=false)) then sl:=true;
if (not(s[i] in r)) and (sl=true) then ss:=ss+s[i];
if ((s[i] in r)or(i=length(s))) and (sl=true) then
begin
if ss[1]=ss[length(ss)] then inc(pl);
ss:=''; sl:=false;
end;
inc(i)
end;
SepWord:=pl;
end;

var
pl:integer;
s:String;
begin
writeln('Enter string....');
readln(s);
writeln('word count=',sepword(s));
readln;
end.

Автор: virt 28.11.2005 13:12

вариант решения первой задачи ::

Цитата
1.строим выпуклую оболочку
2.добавляем оставшиеся вершины
а.условно разделяем множество на 2 половины по координате у
у нас будут 2 крайние точки(или отрезки)
б.берем точку P не принадлежащую оболочке ,если она в верхней половине то в верней части контура ищем отрезок из контура такой ,что x
координата точки лежит между его концами (P1 и P2). Удаляем ребро (P1,P2) и добавляем ребра (P1,P) и (P,P2). Мы добавили точку ,контур остался допустимым. Аналогично если точка находится в нижней половине.

Повторяем для всех не включенных в контур точек.



Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: zetsokol 2.12.2005 21:08

Altair огромное спасибо smile.gif


Virt или Altair помогите пожалуйсто с 4 задачей и вот с этой:


5.Сосчитать количество единиц в двоичной записи числа i.
вот некоторые соображения:

{poschitac edenicy}

program Edenicy;
var n,i,c,chislo,j:integer;

begin

readln(chislo);

n:=0;

for i:=1 to chislo do

begin
j:=i; c:=0;
while j<>0 do begin
if j mod 10 = 1 then inc©;
j:=j div 10;
end;
if c>=2 then inc(n);

end;

writeln(n);
readln;
end.


И если моно полный код задачи 1. Заранее СПАСИБО! Просто сроки поджимают

Автор: volvo 2.12.2005 21:14

Цитата
Сосчитать количество единиц в двоичной записи числа

Я бы делал так:
var
X, i, n: Integer;
begin
Readln(X);

n := 0;
for i := 0 to 15 Do
if (($0001 shl i) and X) <> 0 then inc(n);

writeln(n);
end.


Решение задачи №4 есть здесь: http://algolist.manual.ru/olimp/ar_sol.php#a23

Автор: zetsokol 6.12.2005 14:20

Распишите (Код программы) Pleese 4 и 1 задачи ну очень нуно уже скоро здаваться rolleyes.gif

Автор: volvo 6.12.2005 14:31

zetsokol, ты что, сам думать совсем не хочешь? dry.gif
Вот четвертая:

var
X, p, n: Integer;
begin
Readln(X);

n := 0; p := 1;
while X > 3 do begin
inc(n); dec(X, 2);
end;

if X = 3 then begin
write(' 3'); p := 3;
end
else inc(n);

while n > 3 do begin
write(' 3 3'); dec(n, 3);
p := p * 9;
end;

while n > 0 do begin
write(' 2'); dec(n);
p := p * 2;
end;

writeln;
writeln('Произведение = ', p);
end.

Первая - нудная очень...

P.S. Не делай из темы свалку с несколькими вопросами !!!

Автор: zetsokol 6.12.2005 20:21

Да просто я на VFoxPro работаю и времени нету все работа работа. Но за это огромное спасибо выручили меня smile.gif good.gif. Тока распишите(Код программы) пожалуйста 1 задачу и я отстану от ВАС. Спасибо!!!

Автор: zetsokol 9.12.2005 14:05

Кто-нибудь помогите с первой задачей горю blink.gif mega_chok.gif smile.gif

Автор: volvo 9.12.2005 19:54

Цитата
помогите с первой задачей

Ну, например, так:
Прикрепленный файл  polygon.pas ( 3.94 килобайт ) Кол-во скачиваний: 586


Тестировалось на следующих координатах:
Цитата(Console)
6 точек
3 2
6 4
8 5
12 3
10 6
5 8


Отдельное спасибо Romtek-у за процедуру построения выпуклой оболочки... blum.gif

Автор: zetsokol 18.12.2005 22:24

Огромное тебе спасибо VOLVO applause.gif !thanks.gif !thanks.gif !thanks.gif respect2.gif