[Swust OJ 567]--老虎在不在笼子里(凸包问题)
题目链接:http://acm.swust.edu.cn/problem/567/
你的任务就是通过GPS给出的老虎的坐标和笼子的坐标来让电脑计算出老虎的位置,是躲在洞里了,还是跑到外面去了.
第一行是一个数据N(0<=N<=12),代表了笼子的坐标X,Y的个数(X,Y都在INT范围内);
第二到N+1行是N个坐标X,Y,依次按从下逆时针的顺序来给出的.
最后一行是老虎的坐标X,Y;
注:只有一组测试数据,输入的都是整数,笼子一定是凸多边形,而且老虎也不会出现在笼子边界上
三角形的面积可以用向量的外积来计算,那么多边形是N个三角形,那么就可以。。。。。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
4
0 0
1 0
1 1
0 1
0.5 0.5
6
1 -1
2 0
1 1
-1 1
-2 0
-1 -1
3 3
|
1
2
|
YES
NO
|
//只需要判断加入该点凸包面积,和笼子构成凸包面积是否相等即可 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<cmath>
using namespace std;
struct node{
double x, y;
}point[], tiger[], posA, posB, tmp;//posB老虎基准量 double dis(node a, node b){
return pow((a.x - b.y), ) + pow((a.y - b.y), );
} //按点集分布排序,利用向量平行关系判断
bool cmp(node a, node b){
double povit = (a.x - posA.x)*(b.y - posA.y) - (b.x - posA.x)*(a.y - posA.y);
if (povit > || !povit && (dis(a, posA) < dis(b, posA)))
return true;
return false;
} //当前点是否在点集左侧,利用叉乘比较3个点两条线的斜率关系
bool turn_left(node p1, node p2, node p3){
return (p2.x*p1.y + p3.x*p2.y + p1.x*p3.y - p3.x*p1.y - p1.x*p2.y - p2.x*p3.y) > ? true : false;
} int main(){
int i, sign1, sign2, n;
double area1, area2;
cin >> n;
for (i = ; i < n; i++){
cin >> point[i].x >> point[i].y;
tiger[i].x = point[i].x;
tiger[i].y = point[i].y;
}
cin >> tiger[i].x >> tiger[i].y;//老虎坐标
stack<node> Q;
sign1 = ;
posA = posB = point[];
//分别找到笼子,加入老虎坐标 的点集的最左下的点
for (i = ; i < n + ; i++){
if (i<n){
if (posA.y == point[i].y&&posA.x>point[i].x || point[i].y < posA.y){
posA = point[i];
sign1 = i;
}
}
else{
posB = posA;
sign2 = sign1;
if (posB.y == tiger[i].y&&posB.x>tiger[i].x || tiger[i].y < posB.y){
posB = tiger[i];
sign2 = i;
}
}
}
swap(point[], point[sign1]);
swap(tiger[], tiger[sign2]);
sort(point + , point + n, cmp);//利用叉乘按点集离散化,方便筛选构成图凸包有效的点
sort(tiger + , tiger + n + , cmp);
Q.push(tiger[]), Q.push(tiger[]), Q.push(tiger[]); for (i = ; i < n + ; i++){
while (!Q.empty()){
tmp = Q.top();
Q.pop();
if (turn_left(tmp, Q.top(), tiger[i])){
Q.push(tmp);
break;
}
}
Q.push(tiger[i]);
}
//由于给出笼子必为凸包,直接计算面积
area1 = area2 = ;
tmp = point[n - ];
area1 += (posA.x*tmp.y - posA.y*tmp.x) / 2.0;
for (i = n - ; i >= ; i--){
area1 += (tmp.x*point[i].y - tmp.y*point[i].x) / 2.0;
tmp = point[i];
} tmp = Q.top(), Q.pop();
area2 += (posA.x*tmp.y - posA.y*tmp.x) / 2.0;
while (!Q.empty()){
area2 += (tmp.x*Q.top().y - tmp.y*Q.top().x) / 2.0;
tmp = Q.top();
Q.pop();
}
printf("%s\n", area1 == area2 ? "YES" : "NO");
return ;
}
[Swust OJ 567]--老虎在不在笼子里(凸包问题)的更多相关文章
- [Swust OJ 404]--最小代价树(动态规划)
题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535 Des ...
- [Swust OJ 649]--NBA Finals(dp,后台略(hen)坑)
题目链接:http://acm.swust.edu.cn/problem/649/ Time limit(ms): 1000 Memory limit(kb): 65535 Consider two ...
- SWUST OJ NBA Finals(0649)
NBA Finals(0649) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 404 Accepted: 128 Descri ...
- OJ提交题目中的语言选项里G++与C++的区别
一.OJ提交题目中的语言选项里G++与C++的区别 http://www.th7.cn/Program/cp/201405/199001.shtml 首先更正一个概念,C++是一门计算机编程语言,G+ ...
- [Swust OJ 1023]--Escape(带点其他状态的BFS)
解题思路:http://acm.swust.edu.cn/problem/1023/ Time limit(ms): 5000 Memory limit(kb): 65535 Descript ...
- [Swust OJ 1125]--又见GCD(数论,素数表存贮因子)
题目链接:http://acm.swust.edu.cn/problem/1125/ Time limit(ms): 1000 Memory limit(kb): 65535 Descriptio ...
- [Swust OJ 1126]--神奇的矩阵(BFS,预处理,打表)
题目链接:http://acm.swust.edu.cn/problem/1126/ Time limit(ms): 1000 Memory limit(kb): 65535 上一周里,患有XX症的哈 ...
- [Swust OJ 1026]--Egg pain's hzf
题目链接:http://acm.swust.edu.cn/problem/1026/ Time limit(ms): 3000 Memory limit(kb): 65535 hzf ...
- [Swust OJ 1139]--Coin-row problem
题目链接: http://acm.swust.edu.cn/contest/0226/problem/1139/ There is a row of n coins whose values are ...
随机推荐
- Codeforces 116C - Party(dfs)
n个人,每个人之多有一个上司.“上司”关系具有传递性.求最少将人分成多少组,每组中的每个人的上司或者间接上司都不在该组.拿到题就用树的直径wa了一炮... 正解是有向无环森林的最长路.从每个跟节点df ...
- HDU 3625 Examining the Rooms
题目大意:有n个房间,n!个钥匙,在房间中,最多可以破k扇门,然后得到其中的钥匙,去开其它的门,但是第一扇门不可以破开,求可以打开所有门的概率. 题解:首先,建立这样的一个模型,题目相当于给出一个图, ...
- 未能加载文件或程序集“DAL”或其他的某一个依赖项,系统找不到指定的文件
针对这个问题我在敲VB.NET机房收费系统的时候总共出现了两次,第一次是在使用反射+抽象工厂的时候出现的,第二次是在使用VS2012自带的打包工具生成可执行文件执行exe文件的时候出现的.具体看下图: ...
- 解决外贸电商难题,PayPal中国外贸电商大会圆满礼成
在全球经济一体化的背景下,越来越多的中国企业将目光转移到了海外.对中国的企业而言,要想将生意做到海外大致有两种方法可供选择,一是到海外设立分支机构或者分公司,二是通过外贸电子商务平台实现交易. ...
- iOS开发UI 篇—CAlayer层的属性
一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property CGPoint position; 用来设 ...
- 【翻译】【中英对照】【企业库6】动手实验 Hands-On Lab 日志应用程序块索引页
Logging Application Block Hands-On Lab for Enterprise Library 企业库的日志应用程序块动手实验 This walkthrough shoul ...
- C# Webservice
c#webservice的简单示例 webservice传递的数据只能是序列化的数据,典型的就是xml数据. 下面以一个简单例子为例: (一)新建——-项目---Visual C#---web-- ...
- IOS中的自动布局
Autolayout是一种“自动布局”技术,专门用来布局UI界面 Autolayout能很轻松地解决屏幕适配问题 Autolayout的两条核心概念: >1 参照:通过参照其他控件或父控件来 ...
- ASP.NET 操作配置文件
1.配置文件的各种操作 http://www.cnblogs.com/shimeng3344518/archive/2007/04/23/723999.html 2. http://www.jb51. ...
- java concurrency: ThreadLocal及其实现机制
转载:http://shmilyaw-hotmail-com.iteye.com/blog/1703382 ThreadLocal概念 从字面上来理解ThreadLocal,感觉就是相当于线程本地的. ...