博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1066:Treasure Hunt——题解
阅读量:6196 次
发布时间:2019-06-21

本文共 1293 字,大约阅读时间需要 4 分钟。

题目大意:给一个由墙围成的正方形,里面有若干墙,每次破墙只能从(当前看到的)墙的中点破,求最少破多少墙才能看到宝藏。

——————————————————————

显然枚举起点然后画一条以终点为端点的线,求线和多少墙相交即可。

但是我不会证明:这里有证明:

然后有该证明我们得到只要起点为这些线的端点即可。

#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef double dl;const int INF=2147483647;const int N=31;struct point{ //既是向量又是点 dl x; dl y;}p[2*N],ed;int n;inline point getmag(point a,point b){ point s; s.x=b.x-a.x;s.y=b.y-a.y; return s;}inline dl multiX(point a,point b){ return a.x*b.y-b.x*a.y;}inline int intersect(point a,point b){ int ans=0; if(a.x==b.x&&a.y==b.y)return 0; for(int i=1;i<=n;i++){ dl d1=multiX(getmag(a,p[i]),getmag(a,b))*multiX(getmag(a,p[i+n]),getmag(a,b)); dl d2=multiX(getmag(p[i],a),getmag(p[i],p[i+n]))*multiX(getmag(p[i],b),getmag(p[i],p[i+n])); if(d1<=0&&d2<=0)ans++; } return ans;}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lf%lf%lf%lf",&p[i].x,&p[i].y,&p[i+n].x,&p[i+n].y); } scanf("%lf%lf",&ed.x,&ed.y); if(n==0){ printf("Number of doors = 1\n"); return 0; } int ans=INF; for(int i=1;i<=2*n;i++){ ans=min(ans,intersect(p[i],ed)); } printf("Number of doors = %d\n",ans); return 0;}

 

转载于:https://www.cnblogs.com/luyouqi233/p/8058229.html

你可能感兴趣的文章
PHP生成word的三种方式
查看>>
Iphone连轴画的实现
查看>>
Win7局域网打印机共享设置(详细图文流程)
查看>>
亿能测试资讯_2013-8-11
查看>>
为什么要使用AOP?
查看>>
Perl代码片段-正则表达式测试程序
查看>>
java路径Java开发中获得非Web项目的当前项目路径
查看>>
uva-442 Matrix Chain Multiplication
查看>>
(喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句...
查看>>
Beauty Contest
查看>>
[ACM_模拟] POJ1068 Parencodings (两种括号编码转化 规律 模拟)
查看>>
黑苹果收集
查看>>
【转】Struts2 和 Spring MVC对比
查看>>
【Hibernate步步为营】--继承映射具体解释
查看>>
Android -- ImageLoader简析
查看>>
『一些同学学不好C语言,把罪责归于「因为教材是谭浩强写的」实在是很滑稽』吗?...
查看>>
mysql 索引相关知识
查看>>
自定义控件出现“loaded nib but the view outlet was not set”
查看>>
深信服笔试题(网络project师售后)
查看>>
我是一个线程(修订版)
查看>>