본문 바로가기
IT/BOJ

백준(BOJ) 2987 사과나무 **

by 빨강자몽 2018. 6. 1.

우선 이 문제는 CCW 알고리즘을 알고 공부하는 것이 좋다.



CCW를 이해했다면


"처음에 주어진 삼각형을 이루는 3점이 시계방향이라면

안에 있는점과 이루는 방향성은 시계방향이다."


이를 이용해서 풀면 된다.


 처음 주어진 삼각형이 시계방향이라면 부분을 놓쳐서 몇번 제출을 했다...



#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <math.h>
#include <queue>
#include <set>
#include <list>
#include <utility>
#include <functional>
#define MAX 1005
#define INF 987654321
#define MOD 1000000
#pragma warning(disable:4996)
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
typedef pair<float, float> pf;

int n,x,y,ans=0;
vector<pi> v;

int ccw(pi p1,pi p2,pi p3)
{    return p1.first*(p2.second-p3.second)+p2.first*(p3.second-p1.second)+p3.first*(p1.second-p2.second);}
int main()
{
    for(int i=0;i<3;i++)
    {
        scanf("%d%d",&x,&y);
        v.push_back(make_pair(x, y));
    }
    if(ccw(v[2],v[1],v[0])>0)
        swap(v[2],v[0]);
    printf("%.1f\n",abs(ccw(v[0],v[1],v[2])/2.0));
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        pi tmp=make_pair(x, y);
        if(0<ccw(tmp,v[1],v[0]))
            continue;
        if(0<ccw(tmp,v[0],v[2]))
            continue;
        if(0<ccw(tmp,v[2],v[1]))
            continue;
        ans++;
    }
    printf("%d",ans);
    return 0;
} 


'IT > BOJ' 카테고리의 다른 글

백준(BOJ) 2932 표회전 *  (0) 2018.06.01
백준(BOJ) 2098 외판원 순회 **  (0) 2018.06.01
백준(BOJ) 3190 뱀 **  (0) 2018.06.01
백준(BOJ) 3048 개미 *  (0) 2018.06.01
백준(BOJ) 2188 축사 배정 ***  (0) 2018.06.01