Car

【问题描述】

在地图上散落着 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值