ЕБ
Екатерина Бондаренко

Задача Pascal. СРОЧНО!

СРОЧНО! Помогите решить задачу на Pascal, третий день голову ломаю.
Вот условие задачи
Вот мое решение, но оно вылетает на 14 тесте, помогите, пожалуйста, ЗАРАНее спасибо!
var m:array[1..21,1..21]of integer;
k1,k2,k3,k4,k,n,i,j,k5:integer;
f:boolean;
begin
assign(input,'input.txt');
assign(output,'output.txt');
reset(input);
rewrite(output);
readln(n);
for i:=1 to n do
begin
for j:=1 to 2 do
read(m[i,j]);
readln;
end;
k1:=0;
k2:=0;
k3:=0;
k4:=0;
for i:=1 to n do
begin
f:=true;
if (m[i,1]>0) and (m[i,2]>0) and (m[i,1]=m[i,2]) then begin f:=false; k2:=k2+1;end;
if (m[i,1]<0) and (m[i,2]>0) and (abs(m[i,1])=abs(m[i,2]))then begin f:=false; k1:=k1+1;end;
if (m[i,1]<0) and (m[i,2]<0) and (abs(m[i,1])=abs(m[i,2]))then begin f:=false; k3:=k3+1;end;
if (m[i,1]>0) and (m[i,2]<0) and (abs(m[i,1])=abs(m[i,2]))then begin f:=false; k4:=k4+1;end;
if (f=true) and (m[i,1]<>0) and (m[i,2]<>0) then k:=k+1;
end;
if k1>1 then k1:=1;
if k2>1 then k2:=1;
if k3>1 then k3:=1;
if k4>1 then k4:=1;
k:=k+k1+k2+k3+k4;
k1:=0;
k2:=0;
k3:=0;
k4:=0;
f:=true;
for i:=1 to n do
begin
if (m[i,1]=0) and (m[i,2]>0) then k1:=k1+1;
if (m[i,1]=0) and (m[i,2]<0) then k2:=k2+1;
if (m[i,1]<0) and (m[i,2]=0) then k3:=k3+1;
if (m[i,1]>0) and (m[i,2]=0) then k4:=k4+1;
end;
if k1>1 then k1:=1;
if k2>1 then k2:=1;
if k3>1 then k3:=1;
if k4>1 then k4:=1;
k:=k+k1+k2+k3+k4;
writeln(k);
close(input);
close(output);
end.

ВM
Валерий Master

странно, не дает написать на английском данный чат

КМ
Кристина Михайлова

Во-первых: Очень трудно ориентироваться в коде, если не понятно где X, а где Y :

var
M : array [1..21] of record
X, Y : Integer;
end;

Тогда и чтение будет гораздо проще:

for i := 1 to N do
ReadLn(M[ i].X, M[ i].Y);

Во-вторых: из уравнения прямой в общем виде, можно вывести условие принадлежности точки прямой:

{ Условие принадлежности точки j прямой (0, i) }
{ Из формулы: (Y1-Y2)*X + (X2-X1)*Y + (X1*Y2-X2*Y1) = 0 }
{ где 1 точка (0,0), вторая (M[ i].X, M[ i].Y]), подстановочная (M[j].X, M[j].Y) }
{ Получается формула: (0-M[ i].Y)*M[j].X + (M[ i].X-0)*M[j].Y + (0*M[ i].Y-M[ i].X*0) = 0 }
if M[ i].X*M[j].Y - M[ i].Y*M[j].X = 0 then { Точки лежат на одной линии.. . }

В-третьих: Конечно. Этого не достаточно.
Ещё нужно узнать, находятся ли эти точки в одной четверти:

if (Sign(M[ i].X) = Sign(M[j].X)) and (Sign(M[ i].Y) = Sign(M[j].Y)) then { ...и в одной четверти }

Вот если эти условия выполняются, то мы можем преспокойненько из массива удалить лишнюю точку, лежащую на одной прямой с первой:

Dec(n); { Уменьшение количества рассматриваемых точек }
for k := j to n do
M[k] := M[k + 1];

В итоге N — это ответ на заданный вопрос.

А вся программа выглядит вот так:

var
M : array [1..21] of record
X, Y : Integer;
end;
i, j, N, k: integer;

begin
Assign(input, 'input.txt');
Assign(output, 'output.txt');
Reset(input);
Rewrite(output);
ReadLn(N);
for i := 1 to N do
ReadLn(M[ i].X, M[ i].Y);

i := 1;
repeat
j := i+1;
repeat
{ Условие принадлежности точки j прямой (0, i) }
{ Из формулы: (Y1-Y2)*X + (X2-X1)*Y + (X1*Y2-X2*Y1) = 0 }
{ где 1 точка (0,0), вторая (M[ i].X, M[ i].Y]), подстановочная (M[j].X, M[j].Y) }
{ Получается формула: (0-M[ i].Y)*M[j].X + (M[ i].X-0)*M[j].Y + (0*M[ i].Y-M[ i].X*0) = 0 }
if M[ i].X*M[j].Y - M[ i].Y*M[j].X = 0 then
{ Точки лежат на одной линии.. . }
if (Sign(M[ i].X) = Sign(M[j].X)) and (Sign(M[ i].Y) = Sign(M[j].Y)) then
{ ...и в одной четверти }
{ Значит вторую точку можно удалить }
begin
Dec(N);
for k := j to n do
M[k] := M[k + 1];
end
else { На одной линии, но в разных направлениях от (0,0) }
Inc(j)
else { Не на одной линии }
Inc(j);
until j > N;
Inc(i);
until i = N;

{ Размер массива соответствует количеству уникальных прямых }
WriteLn(N);
Close(input);
Close(output);
end.

Похожие вопросы
Задача по массивам в Pascal
Как составить задачу в PASCAL?
Задача по информатики PASCAL
Pascal-простейшая задача
Задачи на программе Pascal!!!
Помогите с задачей по Pascal...
Помогите с Pascal задачей.
!!!СРОЧНО!! ! Pascal !!!
Помогите срочно решить задачи в Turbo pascal
Задача в Pascal