2017 计蒜之道 初赛 第一场 A 阿里的新游戏

题链:https://nanti.jisuanke.com/t/15499

这题观察图纸可知成三线段上的相邻点之间的距离有1,2,3三种情况的,同时要成线段必然是同横坐标或者纵坐标,然后我们排除掉穿过0的特殊案例(例如:-1,1,3)就可以啦。

#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <vector>
#define ll long long
#define inf 1000000000000000LL
#define mod 1000000007
using namespace std;
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
const int N=100;
struct node{
    int x,y;
}a[N];
bool check(int i,int j,int k){
     int flag=0;
    if(a[i].x==a[j].x&&a[j].x==a[k].x) flag=1;
    if(a[i].y==a[j].y&&a[j].y==a[k].y) flag=2;
    if(!flag) return false;
    int s[3],ss[3];
    if(flag==1){
        ss[0]=a[i].y;
        ss[1]=a[j].y;
        ss[2]=a[k].y;
        s[0]=abs(a[i].y-a[j].y);
        s[1]=abs(a[j].y-a[k].y);
        s[2]=abs(a[i].y-a[k].y);
    }
    if(flag==2){
        ss[0]=a[i].x;
        ss[1]=a[j].x;
        ss[2]=a[k].x;
        s[0]=abs(a[i].x-a[j].x);
        s[1]=abs(a[j].x-a[k].x);
        s[2]=abs(a[i].x-a[k].x);
    }
    sort(s,s+3);
    sort(ss,ss+3);
    if(ss[0]==-1&&ss[1]==1&&ss[2]==3) return false;
    if(ss[1]==-1&&ss[2]==1&&ss[0]==-3) return false;
    if(s[0]==1&&s[1]==1&&s[2]==2) return true;
    if(s[0]==2&&s[1]==2&&s[2]==4) return true;
    if(s[0]==3&&s[1]==3&&s[2]==6) return true;
    return false;
}
int main(){
     int n=read(),m=read();
     int u,v;
     for(int i=0;i<n;i++){
         a[i].x=read();a[i].y=read();
     }
     for(int i=0;i<m;i++) u=read(),v=read();
     int ans=0;
     for(int i=0;i<n;i++){
         for(int j=i+1;j<n;j++){
            for(int k=j+1;k<n;k++){
                if(check(i,j,k)) ans++;
            }
         }
     }
     printf("%d
",ans);
     return 0;
}

原文地址:https://www.cnblogs.com/zsyacm666666/p/6883228.html