用状态压缩较直观
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct point
{
int x,y;
}a[100];
bool cmp(point a,point b)
{
if(a.y<=b.y)
{
if(a.y==b.y)
return a.x<b.x;
else
return 1;
}
else
return 0;
}
int n;
int dp[(1<<20)+100];
int sta[(1<<20)+100],cnt;
bool judge(int i,int j,int k,int l)
{
point tmp[4]={a[i],a[j],a[k],a[l]};
sort(tmp,tmp+4,cmp);
if(tmp[0].y!=tmp[1].y)
return 0;
if(tmp[2].y!=tmp[3].y)
return 0;
if(tmp[0].x!=tmp[2].x)
return 0;
if(tmp[1].x!=tmp[3].x)
return 0;
if(tmp[2].y-tmp[0].y!=tmp[1].x-tmp[0].x||tmp[2].y-tmp[0].y==0)
return 0;
return 1;
}
int cal(int x)
{
int ans=0;
while(x)
{
ans++;
x&=(x-1);
}
return ans;
}
int main()
{
while(cin>>n&&~n)
{
memset(dp,0,sizeof(dp));
cnt=0;
for(int i=0;i<n;i++)
cin>>a[i].x>>a[i].y;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
for(int k=j+1;k<n;k++)
for(int l=k+1;l<n;l++)
if(judge(i,j,k,l))
sta[cnt++]=(1<<i)|(1<<j)|(1<<k)|(1<<l);
for(int i=0;i<cnt;i++)
{
dp[sta[i]]=1;
int tmp=((1<<20)-1)^sta[i];
for(int j=tmp;j;j=tmp&(j-1))
{
if(dp[j])
dp[j|sta[i]]=1;
}
}
int ans=0;
for(int i=0;i<(1<<n);i++)
if(dp[i])
ans=max(ans,cal(i));
cout<<ans<<endl;
}
return 0;
}