2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 C:计算几何

链接: 
 https://www.nowcoder.com/acm/contest/118/C 
 
来源:牛客网

题目描述


艺术家通常要通过颜料的混合得到某种他想要的但又不是从工厂里面生产出来的原始的那种颜料。为了简便起见, 我们假设每种颜料都可以分成是红绿两个分量的数值指标, 即每种颜料都可以用红绿在其中占据的百分比来表示。艺术家从工厂拿回了三种不同颜料分别是(x 1%红,y 1%绿), (x 2%红,y 2%绿),(x 3%红,y 3%绿), 问艺术家是否能够调出自己想要的颜料(x 0%红,y 0%绿)?

输入描述:

八个整数:x0,y0,x1,y1,x2,y2,x3,y3。(0 < xi, yi < 100)

输出描述:

输出Yes如果可以调出, 否则输出No

题解:只要x0,y0在三个点组成的三角形内部即可。

#include <bits/stdc++.h>

using namespace std;

struct point
{
    int x, y;
    void input() {
        scanf("%d %d", &x, &y);
    }
    point() {}
    point(int x, int y) : x(x), y(y){}
    point operator + (const point & z) const {
        return point(x+z.x, y+z.y);
    }
    point operator - (const point & z) const {
        return point(x-z.x, y-z.y);
    }
    int operator ^ (const point & z) const {
        return x * z.y - y * z.x;
    }
}p[4];
struct triangle
{
    point a,b,c;
    triangle() {}
    triangle(point a,point b,point c):a(a),b(b),c(c){}
    int area() {
        return abs( (b-a) ^ (c-a) );
    }
};

int main()
{
    while(~scanf("%d %d", &p[0].x, &p[0].y)) {
        for(int i = 1;i <= 3;i ++) p[i].input();
        triangle abc(p[1], p[2], p[3]);
        triangle abp(p[1], p[2], p[0]);
        triangle acp(p[1], p[3], p[0]);
        triangle bcp(p[2], p[3], p[0]);
//        printf("%d %d %d %d\n", abc.area(), abp.area(), acp.area(), bcp.area());
        if(abc.area() == abp.area() + acp.area() + bcp.area()) puts("Yes");
        else puts("No");
    }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/qq_36876305/article/details/80209367
今日推荐