POJ_2002Squares解题报告

原创 2012年03月22日 00:37:46
Squares
Time Limit: 3500MS   Memory Limit: 65536K
Total Submissions: 11181   Accepted: 4064

Description

A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-degree angles. It is also a polygon such that rotating about its centre by 90 degrees gives the same polygon. It is not the only polygon with the latter property, however, as a regular octagon also has this property. 

So we all know what a square looks like, but can we find all possible squares that can be formed from a set of stars in a night sky? To make the problem easier, we will assume that the night sky is a 2-dimensional plane, and each star is specified by its x and y coordinates. 

Input

The input consists of a number of test cases. Each test case starts with the integer n (1 <= n <= 1000) indicating the number of points to follow. Each of the next n lines specify the x and y coordinates (two integers) of each point. You may assume that the points are distinct and the magnitudes of the coordinates are less than 20000. The input is terminated when n = 0.

Output

For each test case, print on a line the number of squares one can form from the given stars.

Sample Input

4
1 0
0 1
1 1
0 0
9
0 0
1 0
2 0
0 2
1 2
2 2
0 1
1 1
2 1
4
-2 5
3 7
0 0
5 2
0

Sample Output

1
6
1
题目连接:http://poj.org/problem?id=2002
算法类型:Hash
解题思路:先把每个点所对应的Hash值储存在对应的容器里,在依次枚举两个点,算出其所对应的另外四个点,分别在其对应的容器中依次查找,如果两个点都找到,总数加一,最后把总数除以四。
算法实现:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<vector>
using namespace std;
#define MAX 9997
struct Squares
{
	int x;
	int y;
}squ[100002];
int Hash(Squares squ) //hash 函数;
{
	int s;
	s=squ.x*squ.x+squ.y*squ.y+squ.y;
	return s%MAX;
}
int  main()
{
	int N;
	while(scanf("%d",&N)!=EOF)
	{
		if(N==0)
		break;
		memset(squ,0,100002);
		vector<Squares> v[MAX];  //系统容器;
		memset(v,0,MAX);
		int sum=0;
		int i,J,JJ,P,PP;
		int hash,hash1,hash2,hash3,hash4;
		int X1,Y1,X2,Y2,X3,Y3,X4,Y4;
		for(i=0;i<N;i++)
		{
			scanf("%d %d",&squ[i].x,&squ[i].y);
			hash=Hash(squ[i]);
			v[hash].push_back(squ[i]);  //按照hash值储存在对应的容器中;
		}
		for(int q=0;q<N;q++)
		{
			for(int w=q+1;w<N;w++)
			{
				J=0;
				JJ=0;
				P=0;
				PP=0;
				X1=squ[q].x+squ[w].y-squ[q].y;  //  算出对应的点;
				Y1=squ[q].y-squ[w].x+squ[q].x;
				X2=squ[w].x+squ[w].y-squ[q].y;
				Y2=squ[w].y-squ[w].x+squ[q].x;
				X3=squ[q].x-squ[w].y+squ[q].y;
				Y3=squ[q].y+squ[w].x-squ[q].x;
				X4=squ[w].x-squ[w].y+squ[q].y;
				Y4=squ[w].y+squ[w].x-squ[q].x;
				hash1=X1*X1+Y1*Y1+Y1;
				hash1=hash1%MAX;
				hash2=X2*X2+Y2*Y2+Y2;
				hash2=hash2%MAX;
			    hash3=X3*X3+Y3*Y3+Y3;
				hash3=hash3%MAX;
				hash4=X4*X4+Y4*Y4+Y4;
				hash4=hash4%MAX;
				for(int e=0;e<v[hash1].size();e++)  //分别在其对应的hash值容器中查找;
				{
					if(v[hash1][e].x==X1 && v[hash1][e].y==Y1)
					{
							J=1;
					}
				}
				for(int r=0;r<v[hash2].size();r++)
				{
					if(v[hash2][r].x==X2 && v[hash2][r].y==Y2)
					{
						JJ=1;
					}
				}
		    if(J==1 && JJ==1)
				sum++;  //二个点都找到总数加一;
			for(int m=0;m<v[hash3].size();m++)
			{
				if(v[hash3][m].x==X3 && v[hash3][m].y==Y3)
					{
							P=1;
					}
			}
			for(int t=0;t<v[hash4].size();t++)
			{
				if(v[hash4][t].x==X4 && v[hash4][t].y==Y4)
					{
							PP=1;
					}
			}
			if(P==1 && PP==1)
				sum++;
			}
		}
		printf("%d\n",sum/4);
	}
	return 0;
}


poj解题报告——2313

开始假设b[i] = a[i](1 Mid(b[i - 1], a[i], b[i + 1]) (2
  • Lingfu74
  • Lingfu74
  • 2015年07月28日 13:36
  • 554

NOIP2016提高组解题报告

D1T1玩具谜题   模拟 D1T2天天爱跑步   LCA,树链剖分 D1T3换教室  DP,数学期望,最短路 D2T1组合数问题   数学 D2T2蚯蚓   单调队列,模拟 D2T...
  • qwerty1125
  • qwerty1125
  • 2017年09月10日 20:42
  • 274

算法分析与设计解题报告

解题报告格式:         ①原题中文大意; ②算法思想及解题用到的主要数据结构; ③详细解题思路; ④逐步求精算法描述(含过程及变量说明); ⑤程序注释清单(重要过程的说明); ⑥...
  • u011394079
  • u011394079
  • 2014年09月24日 11:42
  • 255

HDU 1254 推箱子 解题报告

HDU 1254的解题报告
  • lawk97
  • lawk97
  • 2016年09月05日 10:17
  • 385

C语言解题报告模板

问题及代码:/* Copyright (c) 2014, 烟台大学计算机学院 All rights reserved. 文件名称:test.cpp 作 者:贺利坚 完成日期:201...
  • sxhelijian
  • sxhelijian
  • 2016年09月17日 11:10
  • 783

杭电ACM1800解题报告

Flying to the Mars Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe...
  • Aqin556
  • Aqin556
  • 2016年07月27日 11:12
  • 513

noi2016解题报告

D1T1: 首先转化成统计AA型字符串有几种。 st[i]表示从i位置开始的AA型字符串有几个,ed[i]表示到i结束的有几个。 ans=∑st[i]*ed[i-1] 然后枚举A的长度L(AA...
  • wzf_2000
  • wzf_2000
  • 2017年05月21日 19:38
  • 519

HDU1254 推箱子 BFS+优先队列

/* 箱子和人共同组成一个状态,用node来记录状态 使用优先队列,是因为只有箱子移动,记数才+1,并不是每次都+1, 从队列中选择记数最小的,进行下一步搜索 只使用优先队列不能保证结果是最小。 因为...
  • mishifangxiangdefeng
  • mishifangxiangdefeng
  • 2011年12月31日 13:41
  • 1007

POJ 1276 解题报告

百题纪念下。 这道题是多重背包问题。又回顾了下崔添翼大神的背包九讲。当然最终还是参考了discuss上面一位同学的实现:http://poj.org/showmessage?message_id=3...
  • thestoryofsnow
  • thestoryofsnow
  • 2014年12月15日 08:46
  • 700

NOIP2017普及组题解

1【分析】 直接输出a∗0.3+b∗0.2+c∗0.5a*0.3+b*0.2+c*0.5即可,代码不给了。2【分析】 有2种做法,第一种是求出10x10^x,然后把每个书的号码模上一下,判断和y是...
  • qq_31640513
  • qq_31640513
  • 2017年11月11日 19:02
  • 1886
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ_2002Squares解题报告
举报原因:
原因补充:

(最多只允许输入30个字)