题目:题目链接
题意:找正方形的个数有多少?
分析:枚举对角线坐标就可以了,爆搞一下
代码:
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int MAXN=40;
int n,ans;
struct point
{
int x,y;
friend bool operator < (const point &a, const point &b )
{
if(a.x!= b.x)
return a.x<b.x;
return a.y<b.y;
}
} Point[MAXN];
bool visited[MAXN];
int Check(int x,int y)
{
int i;
for(i=0; i<n; i++)
{
if(!visited[i] && Point[i].x == x && Point[i].y == y)
return i;
}
return -1;
}
void DFS(int num)
{
int i,j;
if(num>ans)
ans=num;
for(i=0; i<n; i++)
{
if(!visited[i])
{
for(j=i+1; j<n; j++)
{
if(!visited[j])
{
if((Point[j].x-Point[i].x)==(Point[j].y-Point[i].y)&&(Point[j].x-Point[i].x))
{
int t1=Check(Point[i].x, Point[j].y);
int t2=Check(Point[j].x, Point[i].y);
if(t1!=-1 && t2!=-1)
{
visited[i]=true,visited[j]=true,visited[t1]=true,visited[t2]=true;
DFS(num+1);
}
}
}
}
}
}
}
int main()
{
int i;
while(~scanf("%d",&n))
{
if(-1==n)
break;
for(i=0; i<n; i++)
scanf("%d%d",&Point[i].x,&Point[i].y);
sort(Point,Point+n);
ans=0;
memset(visited,0,sizeof(visited));
DFS(0);
printf("%d\n",ans*4);
}
return 0;
}