СРОЧНО! Помогите решить задачу на 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.
Другие языки программирования и технологии
Задача Pascal. СРОЧНО!
странно, не дает написать на английском данный чат
Во-первых: Очень трудно ориентироваться в коде, если не понятно где 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.
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 не смог)
- Срочно!!!!Программирование на Borland Pascal. Срочно помогите!!!!Плз!!!
- задача pascal. представить число в виде всех возможных сумм.
- Помогите решить задачу Pascal
- Задача Pascal одна ошибка
- Задача Pascal ABC: Точечный удар