先排序,然后从左下角暴力搜一次。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,res;
int vis[20];
struct node{
int x;
int y;
}N[20];
int cmp(node a,node b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
void dfs(int t,int sum){
if(sum>res) res=sum;
int i,j,k,z;
for(i=t;i<n;i++){
if(vis[i]) continue;
for(j=i+1;j<n;j++){
if(vis[j]) continue;
int l1=N[j].y-N[i].y;
if(l1==0) continue;
if(N[j].x!=N[i].x) continue;
for(k=j+1;k<n;k++){
if(vis[k]) continue;
int l2=N[k].x-N[i].x;
if(l2==0) continue;
if(N[k].y!=N[i].y) continue;
for(z=k+1;z<n;z++){
if(N[z].x-N[j].x!=l2) continue;
if(N[z].y-N[k].y!=l1) continue;
if(l1!=l2) continue;
if(vis[z]) continue;
vis[i]=vis[j]=vis[k]=vis[z]=1;
//printf("4dian:%d %d %d %d\n",i,j,k,z);
dfs(t+1,sum+4);
vis[i]=vis[j]=vis[k]=vis[z]=0;
}
}
}
}
return ;
}
int main(){
while(~scanf("%d",&n)){
if(n==-1) break;
for(int i=0;i<n;i++)
scanf("%d%d",&N[i].x,&N[i].y);
sort(N,N+n,cmp);
res=0;
memset(vis,0,sizeof vis);
dfs(0,0);
printf("%d\n",res);
//cout<<res<<endl;
}
return 0;
}
/*
3
1 1
0 0
2 2
8
0 0
1 0
2 0
3 0
0 1
1 1
2 1
3 1
10 1
10 0
-1
*/