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\n",ans);
return 0;
}