PKU 3432 Count Squares

Count Squares
Time Limit: 3000MS
Memory Limit: 65536K
Total Submissions: 1331
Accepted: 552
Description
Given a set of points with integer coordinates xi, yi, i = 1...N, your program must find all the squares having each of four vertices in one of these points.
Input
Input file contains integer N followed by N pairs of integers xi yi.
Constraints
-104 ≤ xi, yi ≤ 104, 1 ≤ N ≤ 2000. All points in the input are different.
Output
Output file must contain a single integer — number of squares found.
Sample Input
Sample input 1
4 0 0 4 3 -3 4 1 7
Sample input 2
9
1 1 1 2 1 3
2 1 2 2 2 3
3 1 3 2 3 3

Sample Output
Sample output 1
1
Sample output 2
6

HintBold texts appearing in the sample sections are informative and do not form part of the actual data.
Source Northeastern Europe 2005, Far-Eastern Subregion
제목의 뜻은 매우 간단하다. 한 무리의 다른 점을 주고 이 점들을 구하면 최대 몇 개의 정사각형을 구성할 수 있다.
이 점마다 두 개의 점을 열거하여 정방행의 한 변으로 한 다음에 시계 방향/반시계 방향으로 90도 회전(상대 좌표를 이용하여 계산)하고 다른 두 개의 점의 좌표를 얻어 HASH에 이 두 점이 모두 존재한다면 cnt++를 조회한다.
마지막 cnt/4, 정사각형 하나로 4번 계산된 적 있기 때문에
  • for(i=0;i
                for(j=0;j
  •             {

  •                 if(i==j)continue;
  • //다음은 중점 - 좌표 변환

  •                 TMP.x=P[j].y-P[i].y+P[j].x;
  •                 TMP.y=P[i].x-P[j].x+P[j].y;

  • if(TMP)//isin에서 HASH 테이블에 점이 있는지 확인합니다
  •                 {

  • //좌표 변환, 다른 점 얻기
  •                     TMP.x+=(P[i].x-P[j].x);

  •                     TMP.y+=(P[i].y-P[j].y);
  •                     if(isin(TMP))

  •                         cnt++;
  •                 }

  •             }
  •         printf("%d/n",cnt/4);

  • 좋은 웹페이지 즐겨찾기