poj2318(叉积计算点与直线的关系)

    xiaoxiao2021-04-15  60

    题目链接:http://poj.org/problem?id=2318

        水水的一道题哇!(来熟悉模板, 哈哈)

        判断toys的位置。

        思路很简单,叉乘就可以知道点与直线的关系;比如xmult(point p1, point p2, point p0)>0 p1在直线的左侧(p2,p0是直线的端点,左右理解为眼睛顺着直线的方向的左右)。

       

    #include <iostream> #include <algorithm> #include <fstream> #include <iomanip> #include <cstdio> #include <vector> #include <cstring> #include <cmath> #include <queue> #include <stack> #include <set> #include <map> using namespace std; struct point { int x, y; }; struct line { point a, b; }l[5050]; int mp[5050]; double xmult(point p1, point p2, point p0) { return (p1.x- p0.x)* (p2.y- p0.y)- (p2.x- p0.x)* (p1.y- p0.y); } int main() { int n, m, x1, x2, y1, y2; while(scanf("%d%d%d%d%d%d", &n, &m, &x1, &y1, &x2, &y2)== 6 && n) { memset(mp, 0, sizeof(mp)); for(int i= 0; i< n; i++) { int u, v; scanf("%d%d", &u, &v); point p, q; p.x= u; p.y= y1; q.x= v; q.y= y2; l[i].a= p; l[i].b= q; } for(int i= 0; i< m; i++) { point p; scanf("%d%d", &p.x, &p.y); int ans= 0; for(int j= 0; j< n; j++) if(xmult(p, l[j].a, l[j].b)> 0) ans++; mp[ans]++; } for(int i= 0; i<= n; i++) printf("%d: %d\n", i, mp[i]); printf("\n"); } return 0; }

    
    转载请注明原文地址: https://ju.6miu.com/read-671036.html

    最新回复(0)