zoukankan      html  css  js  c++  java
  • 计算几何刷题

    面积

    1. 传送门
      求面积,注意下内存开的很小,因为起点在原点,那么直接记录相邻的两个点,然后点积求面积即可
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define ll long long
    using namespace std;
    ll ABS(ll x){return x > 0 ? x : -x;}
    /*
    8 北 (x, y + 1) 
    2 南 (x, y - 1)
    6 东 (x + 1, y)
    4 西 (x - 1, y)
    9 东北 (x + 1, y + 1)
    7 西北 (x - 1, y + 1)
    3 东南 (x + 1, y - 1)
    1 西南 (x - 1, y - 1)
    */
    int dir1[] = {0, -1, 0, 1, -1, 0, 1, -1, 0, 1};
    int dir2[] = {0, -1, -1, -1, 0, 0, 0, 1, 1, 1};
    void solve(){
        char s[2];
        ll x = 0, y = 0, px = 0, py = 0;
        ll area = 0;
        while(1){
            scanf("%1s", s);
            if(s[0] == '5') break;
            px += dir1[s[0] - '0'], py += dir2[s[0] - '0'];
            area += (px * y - py * x);
            x = px, y = py;
        }
        area = ABS(area);
        if(area % 2 == 0) printf("%lld
    ", area / 2);
        else printf("%lld.5
    ", area / 2);
    }
    int main(){
        int T;cin >> T;
        for(int i = 1; i <= T; i++){
            solve();
        }
        return 0;
    }
    
    1. 传送门
      pick定理,求三角形里的格点数,求边上的格点数用gcd即可
    #include <iostream>
    #include <cstdio>
    #define ll long long
    using namespace std;
    struct Point{
        ll x, y;
        Point (ll x = 0, ll y = 0):x(x),y(y){};
        Point operator - (const Point &b) const {
            return Point(x - b.x, y - b.y);
        }
    };
    ll ABS(ll x) {return x > 0 ? x : -x;}
    ll Cross(Point a, Point b){
        return (a.x * b.y - a.y * b.x);
    }
    ll gcd(ll a, ll b){
        return b == 0 ? a : gcd(b, a % b);
    }
    ll cal(Point a, Point b){
        ll m = ABS(a.x - b.x);
        ll n = ABS(a.y - b.y);
        if(m == 0 && n == 0) return 0;
        if(m == 0) return n - 1;
        if(n == 0) return m - 1;
        return gcd(n, m) - 1;
    }
    int main(){
        cout << cal(Point(6, 0), Point(0, 9)) << endl;
        int a, b, c, d, e, f;
        while(scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f)){
            if(a == b && b == c && e == f && a == b && c == e) break;
            Point aa(a, b), bb(c, d), cc(e, f);
            ll S = ABS(Cross(bb - aa, cc - aa)) / 2;
            ll B = (cal(aa, bb) + cal(bb, cc) + cal(aa, cc) + 3) / 2;
            printf("%lld
    ", S - B + 1);
        }
        return 0;
    }
    
  • 相关阅读:
    PHP操作数据库
    ANE打包
    我的C++笔记(数据的共享与保护)
    js 正计时和倒计时
    JAVA 日期 一个时间段总共几周,每一天星期几
    mybatis 处理in
    freemarker
    正则手机验证,身份证验证
    签到
    spring定时器
  • 原文地址:https://www.cnblogs.com/Emcikem/p/13484961.html
Copyright © 2011-2022 走看看