POJ 1066 Treasure Hunt [想法题]
题目链接: http://poj.org/problem?id=1066
--------------------------------------------------------------------------------------------------------
这题刚看后可能会去纠结如何建图后进行最短路
不过这样做不仅代码会复杂许多 还有可能出现些不好判断的部分
不过再多想一下我们可以发现如下性质
如果起点和终点位于某条障碍线段的两侧 那么这条线段有且仅有一次被穿过
所以只要统计起点和终点连线穿过的线段条数即可得到答案
又由于保证输入都是整数 所以我们只用在边界上枚举所有相邻整点的中点作为起点即可
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
struct node
{
double x, y;
}a[], b, c;
double cross(const node &aa, const node &bb, const node &cc)
{
return (bb.x - aa.x) * (cc.y - aa.y) - (bb.y - aa.y) * (cc.x - aa.x);
}
bool check(const node &aa, const node &bb, const node &cc, const node &dd)
{
return cross(aa, bb, cc) * cross(aa, bb, dd) < ;
}
int n, ans = , cnt;
int main()
{
scanf("%d", &n);
for(int i = ; i <= (n << ); ++i)
scanf("%lf%lf", &a[i].x ,&a[i].y);
scanf("%lf%lf", &b.x , &b.y);
for(int i = ; i < ; ++i)
{
cnt = ;
c.x = 0.5 + i;
c.y = ;
for(int j = ; j < (n << ); j += )
if(check(a[j], a[j + ], b, c))
++cnt;
ans = min(ans, cnt);
cnt = ;
c.x = 0.5 + i;
c.y = ;
for(int j = ; j < (n << ); j += )
if(check(a[j], a[j + ], b, c))
++cnt;
ans = min(ans, cnt);
cnt = ;
c.y = 0.5 + i;
c.x = ;
for(int j = ; j < (n << ); j += )
if(check(a[j], a[j + ], b, c))
++cnt;
ans = min(ans, cnt);
cnt = ;
c.y = 0.5 + i;
c.x = ;
for(int j = ; j < (n << ); j += )
if(check(a[j], a[j + ], b, c))
++cnt;
ans = min(ans, cnt);
}
printf("Number of doors = %d\n", ans + );
return ;
}
POJ 1066 Treasure Hunt [想法题]的更多相关文章
- poj 1066 Treasure Hunt (Geometry + BFS)
1066 -- Treasure Hunt 题意是,在一个金字塔中有一个宝藏,金字塔里面有很多的墙,要穿过墙壁才能进入到宝藏所在的地方.可是因为某些原因,只能在两个墙壁的交点连线的中点穿过墙壁.问最少 ...
- POJ 1066 Treasure Hunt(线段相交判断)
Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4797 Accepted: 1998 Des ...
- POJ 1066 Treasure Hunt(相交线段&&更改)
Treasure Hunt 大意:在一个矩形区域内.有n条线段,线段的端点是在矩形边上的,有一个特殊点,问从这个点到矩形边的最少经过的线段条数最少的书目,穿越仅仅能在中点穿越. 思路:须要巧妙的转换一 ...
- POJ 1066 - Treasure Hunt - [枚举+判断线段相交]
题目链接:http://poj.org/problem?id=1066 Time Limit: 1000MS Memory Limit: 10000K Description Archeologist ...
- poj 1066 Treasure Hunt
http://poj.org/problem?id=1066 #include <cstdio> #include <cstring> #include <cmath&g ...
- POJ 1066 Treasure Hunt(计算几何)
题意:给出一个100*100的正方形区域,通过若干连接区域边界的线段将正方形区域分割为多个不规则多边形小区域,然后给出宝藏位置,要求从区域外部开辟到宝藏所在位置的一条路径,使得开辟路径所需要打通的墙壁 ...
- [poj] 1066 Treasure Hunt || 判断直线相交
原题 在金字塔内有一个宝藏p(x,y),现在要取出这个宝藏. 在金字塔内有许多墙,为了进入宝藏所在的房间必须把墙炸开,但是炸墙只能炸每个房间墙的中点. 求将宝藏运出城堡所需要的最小炸墙数. 判断点和直 ...
- POJ 1066 Treasure Hunt (线段相交)
题意:给你一个100*100的正方形,再给你n条线(墙),保证线段一定在正方形内且端点在正方形边界(外墙),最后给你一个正方形内的点(保证不再墙上) 告诉你墙之间(包括外墙)围成了一些小房间,在小房间 ...
- POJ 1066 Treasure Hunt【线段相交】
思路:枚举四边墙的门的中点,与终点连成一条线段,判断与其相交的线段的个数.最小的加一即为答案. 我是傻逼,一个数组越界调了两个小时. #include<stdio.h> #include& ...
随机推荐
- 应用安全 - SuiteCRM - 漏洞汇总
CVE-2019-12598.CVE-2019-12601 SuiteCRM SQL注入与远程代码执行漏洞 SalesAgility SuiteCRM .x版本..x版本和7..5之前的7..x版本中 ...
- 视频格式转换.ZC资料
1.20191013: ZC:这些都是 2015年做的尝试,之前貌似没有记录下来,现在 再次用到,把用到的记录下来: ZC: (1) 使用的视频格式转换工具是 "??/XiGua Yings ...
- [LeetCode]29 两数相除和一个小坑点
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...
- Java学习day7面向对象编程1-对象和类
一.Java编程中对象和类的概念 1,什么是类? 答:类是客观存在的,抽象的,概念的东西. 2,什么是对象? 答:对象是具体的,实际的,代表一个事物.例如:车是一个类,汽车,自行车就是他的对象. 关于 ...
- 浅谈格雷码(Grey Code)在信息学竞赛中的应用
1.格雷码的概念 1.性质 格雷码(Grey Code),又叫循环二进制码或反射二进制码,是一种编码方式,它的基本特点是任意两个相邻的格雷码只有一位二进制数不同. 常用的二进制数与格雷码间的转换关系如 ...
- [SPOJ]Count on a tree II(树上莫队)
树上莫队模板题. 使用欧拉序将树上路径转化为普通区间. 之后莫队维护即可.不要忘记特判LCA #include<iostream> #include<cstdio> #incl ...
- 开发一个 Parcel-vue 脚手架工具
前言 像我们熟悉的 vue-cli,create-react-app 等脚手架,只需要输入简单的命令 vue init webpack project,即可快速帮我们生成一个初始项目.在实际工作中,我 ...
- SCAU 2015 GDCPC team_training0
A.题目:http://acm.timus.ru/problem.aspx?space=1&num=2024 题意:求一个包含K个不同字符的集合的最大长度,还有组成这个长度的集合的个数 做法: ...
- 在Centos7.6使用kubeadm部署k8s 1.14.3
K8s不是一个软件,而是一堆软件的集合,由于这堆软件各自独立,因此可能k8s安装过程很容易出现问题 K8s部署有多种方式,本文使用kubeadm部署,从易操作性和可控性来说属于中等的方式 环境:cen ...
- Form表单组件验证
第一版:最基本版本 views源码 #——————————————————————form验证—————————————— from django import forms from django.f ...