Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2010, 19:17   #1
Ponkole
Форумчанин
 
Регистрация: 02.07.2010
Сообщений: 167
По умолчанию Надо разобраться

Что такое М и S
Многоугольник (не обязательно выпуклый) на плоскости задан координатами своих вершин. Требуется подсчитать количество точек с целочисленными координатами, лежащих внутри него (но не на его границе).

Формат входных данных.

В первой строке содержится N (3 ^ N ^ 1000) —число вершин многоугольника. В последующих N строках идут координаты (Xi, Уi) вершин многоугольника в порядке обхода по часовой стрелке. X и У — целые числа, по модулю не превосходящие 1000000.

Формат выходных данных.

В выходной файл вывести одно число — искомое число точек.

Пример файла input.txt:

4

-1 -1

-1 1

1 1

1 -1

Пример файла output.txt:

1



Пример файла input.txt:

3

0 0

0 2

2 0

Пример файла output.txt:

0

















{$N+,E-}

Const

MaxN=1000;

Var

Fi,Fo:Text;

Mn:Array[1..MaxN]Of Record X,Y:LongInt End;

N:Word;

S,M,K:Comp;

Procedure LoadFile;

Var

I:Word;

Begin

Assign(Fi,'e.in');

ReSet(Fi);

Read(Fi,N);

For I:=1 To N Do Begin

Read(Fi,Mn[I].X);

Read(Fi,Mn[I].Y);

End;

Close(Fi);

End;

Procedure CountS;

Var

I:Word;

Begin

S:=0;

For I:=1 To N-1 Do

S:=S+(Mn[I].Y+Mn[I+1].Y+0.0)*(Mn[I].X-Mn[I+1].X);

S:=Abs(S+(Mn[N].Y+Mn[1].Y+0.0)*(Mn[N].X-Mn[1].X));

End;

Procedure CountM;

Var

I:Word;



Function NOD(a,b:LongInt):LongInt;

Var

T:LongInt;

Begin

If a<b Then Begin t:=a;a:=b;b:=t; End;

While B<>0 Do Begin

T:=b;

b:=A Mod B;

A:=T;

End;

NOD:=A;

End;

Begin

M:=0;

For I:=1 To N-1 Do M:=M+NOD(Abs(Mn[I].Y-Mn[I+1].Y),Abs(Mn[I].X-Mn[I+1].X));

M:=M+NOD(Abs(Mn[N].Y-Mn[1].Y),Abs(Mn[N].X-Mn[1].X));

End;

Procedure CountK;

Begin

K:=(S+2-M)/2;

End;

Procedure SaveResult;

Begin

Assign(Fo,'e.out');

ReWrite(Fo);

WriteLn(Fo,K:0:0);

Close(Fo);

End;

Begin

LoadFile;

CountS;

CountM;

CountK;

SaveResult;

End.
Если я тебе помог, помоги и ты мне +ом с комментарием
Ponkole вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
еще не студент, но надо научиться. разобраться и доработать нужно. alexey1990 Помощь студентам 5 23.05.2010 23:08
Надо с SATA разобраться piratkaldun Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 22.11.2009 19:41
Помогите разобраться в двух вещах очень надо ( Droid Win Api 2 06.11.2008 18:31
Помогите пишу дипломку, срочно надо разобраться Irinka Помощь студентам 7 29.03.2008 11:25