zoukankan      html  css  js  c++  java
  • P1665 正方形计数

    题目描述

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

    输入输出格式

    输入格式:

     

    第一行一个数X,以下N个点的坐标。

    【数据规模】

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

    对于100%的数据,满足1≤N≤500; -50≤X[i],Y[i]≤50,点不会重叠。

     

    输出格式:

     

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

     

    输入输出样例

    输入样例#1: 复制
    7
    0 0
    0 1
    1 0
    1 1
    1 2
    2 1
    2 2
    输出样例#1: 复制
    3
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define MAXN 510
    using namespace std;
    int n,ans;
    int vis[2001][2001];
    struct nond{
        int x,y;
    }v[MAXN];
    bool work(int i,int j){
        int dx=(v[i].x+v[j].x)/2,dy=(v[i].y+v[j].y)/2;
        int x1=dx-(dy-v[i].y),y1=dy+(dx-v[i].x);
        int x2=dx+(dy-v[i].y),y2=dy-(dx-v[i].x);
        if(x1<0||y1<0||x2<0||y2<0)    return false;
        if(vis[x1][y1]&&vis[x2][y2])    return true;
        return false;
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&v[i].x,&v[i].y);
            v[i].x+=50;v[i].y+=50;
            v[i].x*=2;v[i].y*=2;
            vis[v[i].x][v[i].y]=1;
        }
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
                if(work(i,j))    ans++;
        cout<<ans/2;
    }
  • 相关阅读:
    poj 2485 Highways 最小生成树
    hdu 3415 Max Sum of MaxKsubsequence
    poj 3026 Borg Maze
    poj 2823 Sliding Window 单调队列
    poj 1258 AgriNet
    hdu 1045 Fire Net (二分图匹配)
    poj 1789 Truck History MST(最小生成树)
    fafu 1181 割点
    减肥瘦身健康秘方
    人生的问题
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/9786860.html
Copyright © 2011-2022 走看看