二維平面座標系中有n個點。
從n個點選擇3個點,問有多少選法使得這3個點形成直角三角形。
第一行包含乙個整數n(3<=n<=1500),表示點數。
接下來n行,每行包含兩個用空格隔開的整數表示每個點的座標,座標值在-10^9到10^9之間。
每個點位置互不相同。
輸出直角三角形的數量。
輸入1:
4 22 1
1 3輸入2:
5 02 6
8 65 7
輸入3:
-1 1
-1 0
0 01 0
1 1輸出1:
輸出2:
輸出3:
這個解釋起來比較麻煩,請自己看英文或**。英文題解
大概就是列舉乙個點和別的點連邊,然後算這條線的斜率(見斜率)。
然後就把斜率排序,列舉可能垂直的兩條的邊(可以用乙個性質,垂直的兩條邊的斜率乘積為-1),就可以了。
const max=1500;
type
ray=record
dx,dy:int64;
jpwang:longint;
end;
var i,j,k,n:longint;
x:array[1..max] of longint;
y:array[1..max] of longint;
g:array[1..max] of ray;
temp:array[1..max] of ray;
num:array[0..3] of longint;
ans:longint;
procedure
turn
(var r:ray);
var temp:int64;
begin
temp:=r.dx;
r.dx:=r.dy;
r.dy:=-temp;
r.jpwang:=(r.jpwang+1) mod
4;end;
procedure
qsort
(lo,hi:longint);
var mid:longint;
i,j,k:longint;
begin
if lo<>hi
then
begin
mid:=(lo+hi) div
2; qsort(lo,mid);
qsort(mid+1,hi);
i:=lo;
j:=mid+1;
k:=lo;
while (i<=mid) and (j<=hi) do
begin
if g[i].dy*g[j].dxthen
begin
temp[k]:=g[i];
i:=i+1;
endelse
begin
temp[k]:=g[j];
j:=j+1;
end;
k:=k+1;
end;
while i<=mid do
begin
temp[k]:=g[i];
i:=i+1;
k:=k+1;
end;
while j<=hi do
begin
temp[k]:=g[j];
j:=j+1;
k:=k+1;
end;
for i:=lo to hi do
g[i]:=temp[i];
end;
end;
begin
readln(n);
for i:=1
to n do
readln(x[i],y[i]);
ans:=0;
for i:=1
to n do
begin
for j:=1
to n do
begin
g[j].jpwang:=0;
g[j].dx:=x[j]-x[i];
g[j].dy:=y[j]-y[i];
if i=j
then
begin
g[j].jpwang:=g[1].jpwang;
g[j].dx:=g[1].dx;
g[j].dy:=g[1].dy;
endelse
while
not ((g[j].dx>0) and (g[j].dy>=0)) do
turn(g[j]);
end;
qsort(2,n);
j:=2;
while j<=n do
begin
fillchar(num,sizeof(num),0);
k:=j;
while (k<=n) and (g[j].dy*g[k].dx=g[k].dy*g[j].dx) do
begin
num[g[k].jpwang]:=num[g[k].jpwang]+1;
k:=k+1;
end;
j:=k;
ans:=ans+num[0]*num[1];
ans:=ans+num[1]*num[2];
ans:=ans+num[2]*num[3];
ans:=ans+num[3]*num[0];
end;
end;
writeln(ans);
end.
正直角三角形
在平面直角座標系的第一象限內有m個點。正直角三角形 是一種奇特的三角形,它的三個頂點分別在原點 x軸的正方向和y軸的正方向。請用乙個面積最小的 正直角三角形 將這些點全部圍住,求解面積的大小。題目中所有的座標 包括正直角三角形的頂點座標 都為整數。input 1 m,xi,yi 100 每行乙個答案...
JZ高中OJ 1385 直角三角形
time limits 4000 ms memory limits 65536 kb detailed limits description 二維平面座標系中有n個點。從n個點選擇3個點,問有多少選法使得這3個點形成直角三角形。input 第一行包含乙個整數n 3 n 1500 表示點數。接下來n行...
模擬 直角三角形
平面上給定n個兩兩不同的整點,統計以給定的點為頂點,且直角邊平行於座標軸的直角三角形數。輸入格式 輸入檔案right.in第一行為乙個整數n。以下n行,每行給出乙個點的座標。輸出格式 輸出檔名為right.out。輸出乙個整數表示統計結果。輸入樣例 1 0 0 0 11 0 1 1 輸出樣例 1 4...