题意/Description:
很久很久以前有一座寺庙,从上往下看寺庙的形状正好是一个正方形,在4个角上竖立着圆柱搭建而成。现在圆柱都倒塌了,只在地上留下圆形的痕迹,可是现在地上有很多这样的痕迹,专家说一定是最大的那个。
写一个程序,给出圆柱的坐标,找出由4个圆柱构成的最大的正方形,因为这就是寺庙的位置,要求计算出最大的面积。注意正方形的边不一定平行于坐标轴。
例如下图有10根柱子,其中(4,2),(5,2),(5,3),(4,3)可以形成一个正方形,(1,1),(4,0),(5,3),(2,4)也可以,后者是其中最大的,面积为10。
读入/Input:
第一行包含一个N(1<=N<=3000),表示柱子的数量。
接下来N行,每行有两个空格隔开的整数表示柱子的坐标(坐标值在0.到5000之间),柱子的位置互不相同。
输出/Output:
如果存在正方形,输出最大的面积,否则输出0。
题解/solution:
枚举任意两个点,画画的出第三和第四个点:
第三: y1:=y[i]+x[j]-x[i]; x1:=x[i]-y[j]+y[i];
第四: x2:=x1+x[j]-x[i]; y2:=y1+y[j]-y[i];
然后判断这两个点是否存在。
(注:这式子是对于某一条边的。)
代码/Code:
var
n,max:longint;
x,y:array[1..3000] of longint;
a:array[0..5000,0..5000]of boolean;
procedure init;
var
i:longint;
begin
readln(n);
for i:=1 to n do
begin
readln(x[i],y[i]);
a[x[i],y[i]]:=true;
end;
max:=0;
end;
procedure main;
var
i,j,x1,x2,y1,y2,s:longint;
begin
for i:=1 to n-1 do
begin
for j:=i+1 to n do
begin
s:=sqr(x[j]-x[i])+sqr(y[j]-y[i]);
if s>max then
begin
y1:=y[i]+x[j]-x[i];
x1:=x[i]-y[j]+y[i];
x2:=x1+x[j]-x[i];
y2:=y1+y[j]-y[i];
if (x1>=0) and (x2>=0) and (y1>=0) and (y2>=0) and
(x1<=5000) and (x2<=5000) and (y1<=5000) and (y2<=5000) and
a[x1,y1] and a[x2,y2] then max:=s;
end;
end;
end;
end;
begin
init;
main;
writeln(max);
end.