【问题描述】
在地图上散落着 n 个车轮,小 J 想用它们造一辆车。要求如下:
1. 一辆车需要四个车轮,且四个车轮构成一个正方形
2. 车轮不能移动 你需要计算有多少种造车的方案(两个方案不同当且仅当所用车轮不全相同,坐标相同的两个车轮视为不同车轮)。
【输入格式】
输入文件名为 car.in。
第一行一个整数 n
接下来 n 行,每行两个整数 x y,表示在(x,y)处有一个车轮
【输出格式】
输出文件名为 car.out。
一行一个整数,表示方案数
【数据规模与约定】
30%的数据保证 n ≤ 30
100%的数据保证 1 ≤ n ≤ 1000; |x|, |y| < 20000
【样例】
car.in:
9
0 0
1 0
2 0
0 2
1 2
2 2
0 1
1 1
2 1
car.out:
6
The Way :
枚举对角线两点,暴力判断另外两点是否存在(有几个) 。
至于另外两点的坐标可以推公式(数学方法:画个图+三角形全等),之前想偷懒用离散化和数组WA了,这次乖乖打枚举…
下面贴代码片
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
struct mm{
int x,y;
}a[1010];
long long ans;
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d%d",&a[i].x,&a[i].y);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(i!=j&&a[j].x>a[i].x&&a[j].y<=a[i].y)
{
int m=a[i].x+a[i].y+a[j].x+a[j].y;
int x1=m-2*a[i].y,y1=m-2*a[j].x,x2=m-2*a[j].y,y2=m-2*a[i].x;
if(x1%2==0&&y1%2==0&&x2%2==0&&y2%2==0)
{
int q1=0,q2=0;
for(int k=1;k<=n;++k)
if(a[k].x==x1/2&&a[k].y==y1/2) ++q1;
else if(a[k].x==x2/2&&a[k].y==y2/2) ++q2;
ans+=q1*q2;
}
}
cout<<ans;
return 0;
}