遗址 (Standard IO)

题意/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.



 

posted @ 2016-07-20 15:59  猪都哭了  阅读(289)  评论(0编辑  收藏  举报