P1665 正方形计数

题目描述

给定平面上 N 个点,你需要计算以其中 4 个点为顶点的正方形的个数。注意这里的正方形边不一定需要和坐标轴平行。

输入格式

第一行一个数 N。

接下来 N 行每行两个数,表示点的坐标。

输出格式

一个数表示正方形的个数。

输入输出样例

输入 #1

7
0 0
0 1
1 0
1 1
1 2
2 1
2 2

输出 #1

3

说明/提示

对于 20% 的数据,满足 1≤N≤20。

对于 100% 的数据,满足 1≤N≤500,−50≤Xi​,Yi​≤50,点不会重合。

思路

 利用递推来解决。

完整代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
long long q,p,d,dd,e,ee,c,cc,f,ff,a[5001],b[5001];
bool k[5001][5001];
int main() {
    cin>>n;
    for(int i=1; i<=n; i++) {
        cin>>q>>p;
        a[i]=q+50;
        b[i]=p+50;
        k[a[i]][b[i]]=true;
    }
    for(int i=1; i<=n; ++i) {
        for(int j=1; j<=n; ++j) {
            if(i==j) continue;
            c=a[i];
            cc=b[i];
            f=a[j];
            ff=b[j];
            d=ff-cc+c;
            dd=c-f+cc;
            e=f+ff-cc;
            ee=c-f+ff;
            if(e==d&&dd==ee||e<0||d<0||ee<0||dd<0) continue;
            if(k[d][dd]==true&&k[e][ee]==true) m++;
        }
    }
    cout<<m/4<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值