Treasure Hunt POJ - 1066

Treasure Hunt

题目链接:https://vjudge.net/problem/POJ-1066

题目:

Treasure Hunt POJ - 1066Treasure Hunt POJ - 1066Treasure Hunt POJ - 1066

 

 思路:将给的壁的每个端点与宝藏相连,求出当前线段与多少条线段相连,暴力求出最少相连数,瞎搞过了。。。一开始忘了当N==0情况,应当输出1

 

// 
// Created by HJYL on 2020/1/13.
//
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#define eps 1e-8
#define Inf 0x7fffffff
//#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+100;
struct Point{
    double x,y;
};
double min(double a, double b) { return a < b ? a : b; }

double max(double a, double b) { return a > b ? a : b; }

bool IsSegmentIntersect(Point a, Point b, Point c, Point d)
{
    if( min(a.x, b.x) > max(c.x, d.x) ||
        min(a.y, b.y) > max(c.y, d.y) ||
        min(c.x, d.x) > max(a.x, b.x) ||
        min(c.y, d.y) > max(a.y, b.y) )
        return 0;

    double h, i, j, k;

    h = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
    i = (b.x - a.x) * (d.y - a.y) - (b.y - a.y) * (d.x - a.x);
    j = (d.x - c.x) * (a.y - c.y) - (d.y - c.y) * (a.x - c.x);
    k = (d.x - c.x) * (b.y - c.y) - (d.y - c.y) * (b.x - c.x);

    return h * i <= eps && j * k <= eps;
}

int main()
{
    int T;
    while(~scanf("%d",&T)) {
        Point a[maxn], b[maxn];
        for (int i = 0; i < T; i++)
            scanf("%lf%lf%lf%lf", &a[i].x, &a[i].y, &b[i].x, &b[i].y);
        Point bao;
        scanf("%lf%lf", &bao.x, &bao.y);
        int res[maxn] = {0};
        int pos = 0;
        for (int i = 0; i < T; i++) {
            for (int j = 0; j < T; j++) {
                if (IsSegmentIntersect(bao, a[i], a[j], b[j]))
                    res[pos]++;
            }
            pos++;
        }
        for (int i = 0; i < T; i++) {
            for (int j = 0; j < T; j++) {
                if (IsSegmentIntersect(bao, b[i], a[j], b[j]))
                    res[pos]++;
            }
            pos++;
        }
        sort(res, res + pos);
        if(T==0)
            printf("Number of doors = 1\n");
        else
            printf("Number of doors = %d\n", res[0]);
    }
    return 0;
}
上一篇:P2240 【深基12.例1】部分背包问题


下一篇:CodeForces - 1214D D. Treasure Island