【计算几何】Triangles HUST 1607
2017-05-08 16:42
423 查看
#include<iostream> #include<cstdio> #include<cstring> #include<stack> #include<map> #include<queue> #include<cmath> #include<algorithm> #include<deque> typedef long long LL; using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") const int INF=0x3f3f3f3f; const int N = 200+10; // struct point { double x,y; } poi ; int num; typedef pair<double,double>PII; PII temp[220]; map<PII,int>mp; int tot; int ma ; int GetId(PII s) { if(mp.find(s)!=mp.end()) return mp[s]; mp[s]=++tot; return tot; } struct V //两点式 { point start; point end; }; V change(V a) //两点式起点化为 0,0 { V b; b.start.x = 0; b.start.y = 0; b.end.x = a.end.x - a.start.x; b.end.y = a.end.y - a.start.y; return b; } double cross_mul(V a,V b) { double result; V aa = change(a); V bb = change(b); result = aa.end.x*bb.end.y - aa.end.y*bb.end.x; return result; } const double eps=1e-6; bool Judge(point a,point b,point c) { V aa,bb; aa.start = a; aa.end = b; bb.start = a; bb.end = c; double ans = cross_mul(aa,bb); if(fabs(ans)<eps) return false; return true; } bool pan(point a,point b,point c) { if((a.x - b.x) * (c.x - b.x) < 0 && (a.y - b.y) * (c.y - b.y) < 0) return true; return false; } int main() { PII temp; int n,m; while(~scanf("%d%d",&n,&m)) { mp.clear(); tot=0; num=0; for(int i = 1; i <= n; i++) { cin>>temp.first>>temp.second; int id = GetId(temp); poi[id].x=temp.first; poi[id].y=temp.second; } // printf("%d\n",tot); PII x,y; memset(ma,0,sizeof(ma)); for(int i=0; i<m; ++i) { cin>>x.first>>x.second>>y.first>>y.second; int u=GetId(x); int v=GetId(y); ma[u][v]=ma[v][u]=1; } for(int k=1; k<=tot; k++) for(int i=1; i<=tot; i++) for(int j=1; j<=tot; j++) { if(!Judge(poi[i],poi[j],poi[k])&&ma[i][k]) { //printf("%d %d %d\n",i,k,j); if(pan(poi[i],poi[j],poi[k])) { //puts("??"); ma[i][j]=ma[j][i]=ma[j][k]=ma[k][j]=1; } else if(ma[k][j]) { //puts("**"); ma[i][j]=ma[j][i]=1; } } } // for(int i = 1; i <= tot; i++) // { // for(int j = 1; j <= tot; j++) // printf("ma[%d][%d] = %d ",i,j,ma[i][j]); // puts(""); // } int ans=0; for(int i=1; i<=n; i++) for(int j=i+1; j<=n; j++) for(int k=j+1; k<=n; k++) if(ma[i][j] && ma[j][k] && ma[i][k] && Judge(poi[i],poi[j],poi[k])) { //printf("%d %d %d\n",i,j,k); ans++; } printf("%d\n",ans); } return 0; }
相关文章推荐
- hust 1607 Triangles(经典好题)
- 第八届福建省大学生程序设计竞赛 FZU 2273 Triangles (计算几何)
- HUST 1584 摆放餐桌【计算几何】
- hust 1607 Triangles 校赛 一个很好的题 hash
- hust 1607--Triangles
- HDU 5784- How Many Triangles-计算几何-two-pointer-数锐角三角形个数
- HDU 5784 How Many Triangles(计算几何)
- HUST 1632 Sheep’s Toy I(计算几何 正方形旋转覆盖面积)
- hdu-5784 How Many Triangles(计算几何+极角排序)
- UVa 10112 Myacm Triangles (枚举&计算几何)
- 计算几何中的精度问题 转自hust Erbao
- POJ-1569 Myacm Triangles(计算几何)
- codeforces 13D. Triangles(计算几何 dp)
- ACM学习历程——UVA10112 Myacm Triangles(计算几何,多边形与点的包含关系)
- Codeforces Beta Round #13 D —— Triangles 计算几何
- 【计算几何】fzuoj 2273 Triangles
- HUST 1584 摆放餐桌(计算几何)
- hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形
- fzu 2273 Triangles 计算几何
- Myacm Triangles hoj,poj,uva 计算几何