暴力枚举+stl——CTU 2019 J

/*
求出所有可能的向量V(x,y)使一个点集通过V移动后和新的点集合并,得到给定的点集 
直接枚举1和其他点组成的向量即可
    因为不管怎么平移,1肯定要有个对应的点,所以合法向量就从这里找即可 
    注意:得到的向量统一转换成x>0的向量,然后再*2就是答案
     
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long 

#define N 2005

struct point {
    int x,y;
}p[N]; 

int n,ans;
point V;
map<pair<int,int> ,int>mp;
set<pair<int,int> >s;

int check(){
    for(int i=1;i<=n;i++){
        if(mp[make_pair(p[i].x+V.x,p[i].y+V.y)]==0 && 
           mp[make_pair(p[i].x-V.x,p[i].y-V.y)]==0)
            return 0;
    }    
    return 1;
}

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        scanf("%d%d",&p[i].x,&p[i].y);
        mp[make_pair(p[i].x,p[i].y)]=1;
    }
    for(int i=2;i<=n;i++){
        V.x=p[i].x-p[1].x;
        V.y=p[i].y-p[1].y;
        if(V.x<0)V.x*=-1,V.y*=-1;
        if(V.x==0)V.y=abs(V.y); 
        if(check()){
            s.insert(make_pair(V.x,V.y));
        }
    }
    cout<<s.size()*2<<'\n';
} 

 

上一篇:C语言实现三子棋


下一篇:五子棋的胜负判断函数