zoukankan      html  css  js  c++  java
  • 计算几何(一)

    7.16

    1.https://codeforces.com/problemset/problem/127/A 水题

    2.https://codeforces.com/problemset/problem/136/D

    八个点,分成一个长方形一个正方形,也可以两个正方形

    展开
    int n,k;
    struct Point {
    	int x,y;
    	int id;
    	Point() {}
    	Point(double x,double y):x(x),y(y) {}
    	Point operator - (Point B) {
    		return Point(x-B.x,y-B.y);
    	}
    };
    
    int Distance(Point A,Point B) {
    //	return hypot(A.x-B.x,A.y-B.y);
    	return (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);
    }
    
    Point p[N];
    int vis[10];
    int ch(int x) {
    	int y=0;
    	while(x) {
    		if(x & 1)y++;
    		x /= 2;
    	}
    	if(y == 4)return 1;
    	return 0;
    }
    
    bool cmp(Point a,Point b) {
    	if(a.y != b.y)return a.y < b.y;
    	return a.x < b.x;
    }
    
    
    int ok1(Point v[]) {
    	Point xx = v[2] - v[1];
    	Point yy = v[4] - v[2];
    	if(xx.x*yy.x + xx.y*yy.y != 0)return 0;
    	if(Distance(v[1],v[3]) != Distance(v[2],v[4]))return 0;
    	if(Distance(v[1],v[2]) != Distance(v[3],v[4]))return 0;
    	return 1;
    }
    
    int ok2(Point v[]) {
    	Point xx = v[2] - v[1];
    	Point yy = v[4] - v[2];
    	if(xx.x*yy.x + xx.y*yy.y != 0)return 0;
    	if(Distance(v[1],v[2]) != Distance(v[2],v[4]))return 0;
    	if(Distance(v[2],v[4]) != Distance(v[3],v[4]))return 0;
    	if(Distance(v[4],v[3]) != Distance(v[3],v[1]))return 0;
    	if(Distance(v[3],v[1]) != Distance(v[1],v[2]))return 0;
    	return 1;
    }
    
    void work() {
    	for(int i=1; i<=8; i++) {
    		scanf("%d%d",&p[i].x,&p[i].y);
    		p[i].id =i;
    		vis[i] = 0;
    	}
    	int flag = 0;
    	for(int i=1; i<= (1<<8)-1; i++) {
    		if(!ch(i))continue;
    		int x=i,t=1;
    		Point v1[10],v2[10];
    		int tot1=1,tot2=1;
    
    		for(int i=1; i<=8; i++)vis[i]=0;
    
    		while(x) {
    			if(x & 1) {
    				v1[tot1++] = p[t];
    				vis[t] = 1;
    			}
    			x /= 2;
    			t++;
    		}
    		for(int i=1; i<=8; i++) {
    			if(!vis[i])v2[tot2++] = p[i];
    		}
    		sort(v1+1,v1+5,cmp);
    		sort(v2+1,v2+5,cmp);
    
    		if((ok1(v1)&&ok1(v2)) && (ok2(v1)||ok2(v2))) {
    			if(ok2(v2)) {
    				for(int i=1; i<=4; i++) {
    					swap(v1[i],v2[i]);
    				}
    			}
    			printf("YES
    ");
    			for(int i=1; i<=4; i++)printf("%d ",v1[i].id);
    			printf("
    ");
    			for(int i=1; i<=4; i++)printf("%d ",v2[i].id);
    			printf("
    ");
    			flag = 1;
    			break;
    		}
    	}
    	if(flag ==0 )printf("NO
    ");
    }
    

    3.https://codeforces.com/problemset/problem/140/A 问一个大圆里能否放n个小圆,用圆心角判断

    展开
    void work() {
    	scanf("%d%lf%lf",&n,&R,&r);
    	int x=0;
    	if(r > R)x=0;
    	else if(2*r > R)x=1;
    	else if(2*r==R)x=2;
    	else {
    		double t = asin(r/(R-r));
    		t = PI / t;
    		x = (int)t;
    		if(x+1-t <= eps)x++;
    		
    	}
    	if(x >= n)printf("YES
    ");
    	else printf("NO
    "); 
    }
    

    4.https://codeforces.ml/contest/18/problem/A 问一个三角形能否移动一个距离变成直角三角形

    展开
    const double eps = 1e-9;
    int n,k;
    
    struct Point {
    	int x,y;
    	int id;
    	Point() {}
    	Point(double x,double y):x(x),y(y) {}
    	Point operator - (Point B) {
    		return Point(x-B.x,y-B.y);
    	}
    	bool operator == (Point B) {
    		return x == B.x && y == B.y;
    	}
    };
    
    int Distance(Point A,Point B) {
    //	return hypot(A.x-B.x,A.y-B.y);
    	return (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);
    }
    Point p[3];
    
    int fun(Point x,Point y) {
    	if(x.x*y.x+x.y*y.y == 0)return 1;
    	return 0;
    }
    
    int dir[4][2] = {-1,0,1,0,0,1,0,-1};
    int op[4][2] =  {1,0,-1,0,0,-1,0,1};
    
    int ok1() {
    	Point v1=p[0]-p[1],v2=p[1]-p[2],v3=p[2]-p[0];
    	if(fun(v1,v2) || fun(v2,v3) || fun(v3,v1))return 1;
    	return 0;
    }
    
    int ok2() {
    	for(int i=0; i<3; i++) {
    		for(int j=0; j<4; j++) {
    			p[i].x = p[i].x + dir[j][0];
    			p[i].y = p[i].y + dir[j][1];
    			if(p[0] == p[1] || p[1] == p[2] || p[2] == p[0]) {
    				p[i].x = p[i].x + op[j][0];
    				p[i].y = p[i].y + op[j][1];
    				continue;
    			}
    			if(ok1())return 1;
    			p[i].x = p[i].x + op[j][0];
    			p[i].y = p[i].y + op[j][1];
    		}
    	}
    	return 0;
    }
    
    void work() {
    	for(int i=0; i<3; i++) {
    		scanf("%d%d",&p[i].x,&p[i].y);
    	}
    	if(ok1()) {
    		printf("RIGHT
    ");
    	} else if(ok2()) {
    		printf("ALMOST
    ");
    	} else {
    		printf("NEITHER
    ");
    	}
    }
    
  • 相关阅读:
    一秒解决element容器布局显示内部调节框的问题
    操作管理员
    Linux_网络基础管理
    如何解决在WordPress安装Redis插件时需要输入FTP问题?
    如何在我的EC2实例状态更改时获取自定义电子邮件通知
    利用S3fs在Amazon EC2 Linux实例上挂载S3存储桶
    源码安装Apache(httpd)
    Linux_源码安装包管理理论概述
    Linux_yum命令详解
    Linux_yum仓库管理
  • 原文地址:https://www.cnblogs.com/LaiYiC/p/15022228.html
Copyright © 2011-2022 走看看