标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 101 Accepted Submission(s): 43
#include <map>
#include <set>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <vector>
#include <bitset>
#include <sstream>
#include <cstdlib>
#include <complex>
#include <climits>
#include <cstring>
#include <iostream>
#include <algorithm>
#define REP(i,N) for (int i = 0;i < (N);i++)
#define REP_1(i,N) for (int i = 1;i < (N);i++)
#define REP_2(i,be,en) for (int i = (be);i < (en);i++)
#define DWN(i,N) for (int i = (N);i >= 0;i--)
#define DWN_1(i,N) for (int i = (N);i >= 1;i--)
#define DWN_2(i,en,be) for (int i = (en);i >= (be);i--)
#define FR(N) freopen((N),"r",stdin)
#define FW(N) freopen((N),"w",stdout)
#define SO(N) scanf("%d",&(N))
#define STO(N,M) scanf("%d %d",&(N),&(M))
#define STH(N,M,K) scanf("%d %d %d",&(N),&(M),&(K))
#define PS(N) printf("%d",(int)(N));
#define MAXN 2010
#define GETS(ch) fgets((ch),MAXN,stdin)
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef long long LL;
typedef LL ll;
typedef map<int,LL> MINT;
typedef map<char,int> MCH;
typedef map<string,int> MSTR;
typedef vector<int> VINT;
typedef set<LL> SINT;
typedef pair<int,int> PINT;
LL read(){
LL ret=0,f=1;
char x=getchar();
while(!(x>=‘0‘ && x<=‘9‘)){if(x==‘-‘)f=-1;x=getchar();}
while(x>=‘0‘ && x<=‘9‘) ret=ret*10+x-‘0‘, x=getchar();
return ret*f;
}
class point {
public:
int x,y;
}node[30];
point List[5];
int cross(point p0,point p1,point p2) //计算叉积 p0p1 X p0p2
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
}
double dis(point p1,point p2) //计算 p1p2的 距离
{
return sqrt((double)(p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));
}
bool cmp(point p1,point p2) //极角排序函数 , 角度相同则距离小的在前面
{
int tmp=cross(List[0],p1,p2);
if(tmp>0) return true;
else if(tmp==0&&dis(List[0],p1)<dis(List[0],p2)) return true;
else return false;
}
int cross2(point p0,point p1,point p2) //计算点积 p0p1 · p1p2
{
return (p1.x-p0.x)*(p2.x-p1.x)+(p1.y-p0.y)*(p2.y-p1.y);
}
int ans = 0;
int work(vector<int> V) {
int len = V.size();
for (int i = 1;i < len;i++) {
if (node[V[i]].x < node[V[0]].x) {
swap(V[i],V[0]);
}
else if (node[V[i]].x == node[V[0]].x) {
if (node[V[i]].y < node[V[0]].y) {
swap(V[i],V[0]);
}
}
}
for (int i = 0;i < len;i++) {
List[i] = node[V[i]];
}
sort(List,List + len,cmp);
for (int i = 0;i < len - 1;i++) {
if (dis(List[i],List[i + 1]) - dis(List[i + 1],List[(i + 2) % len]) > 1e-6) return 0;
if (cross2(List[(i + len - 1) % len],List[i],List[i + 1]) != 0) return 0;
}
return 1;
}
int N;
void dfs(int u,int pos,vector<int> V,int num) {
if (pos == num) {
ans += work(V);
return;
}
if (u >= N) return;
V.push_back(u);
dfs(u + 1,pos + 1,V,num);
V.pop_back();
dfs(u + 1,pos,V,num);
}
int main() {
while (cin >> N) {
for (int i = 0;i < N;i++) {
cin >> node[i].x >> node[i].y;
}
vector<int> V;
V.clear();
ans = 0;
dfs(0,0,V,4); // 只能形成4边形
cout << ans << endl;
}
}
标签:
原文地址:http://www.cnblogs.com/xiaoshanshan/p/4714185.html