题意:给出一个100*100的正方形区域,通过若干连接区域边界的线段将正方形区域分割为多个不规则多边形小区域,然后给出宝藏位置,要求从区域外部开辟到宝藏所在位置的一条路径,使得开辟路径所需要打通的墙壁数最少("打通一堵墙"即在墙壁所在线段中间位置开一空间以连通外界),输出应打通墙壁的个数(包括边界上墙壁)。
题解:枚举每一个入口,在所有的情况中取穿墙数最少的输出即可,枚举每一个入口的时候,并不用枚举每条边的中间点,直接枚举该线段的两个顶点就行(因为要经过一个墙,那么从线段的任意地方进去都行,不必要每次从线段的中点过去),将枚举的顶点与终点(即宝藏所在位置)连成线段,然后就是判断剩下的线段与该线段相交的问题了(注意这里是严格相交),最后得出的数字加1即为结果(因为还有边界墙),还有就是需要特别处理n=0时的情况。

个人感觉,计算几何简单的题就是模版的事,只要记住这几个常用模板(叉积,线段相交,Point,Line)一般的计算几何就没问题了。

AC代码:

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;const int INF=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
#define prN printf("\n")
#define SI(N) scanf("%d",&(N))
#define SII(N,M) scanf("%d%d",&(N),&(M))
#define SIII(N,M,K) scanf("%d%d%d",&(N),&(M),&(K))
#define cle(a,val) memset(a,(val),sizeof(a))
#define rep(i,b) for(int i=0;i<(b);i++)
#define Rep(i,a,b) for(int i=(a);i<=(b);i++)
#define reRep(i,a,b) for(int i=(a);i>=(b);i--)
const int MAX_N= 1000+5 ;
const double eps= 1e-9 ;int sgn(double x)
{if(fabs(x) < eps)return 0;if(x < 0) return -1;else return 1;
}
struct Point
{double x,y;Point() {}Point(double _x,double _y){x = _x;y = _y;}Point operator -(const Point &b)const{return Point(x - b.x,y - b.y);}double operator ^(const Point &b)const{return x*b.y - y*b.x;}double operator *(const Point &b)const{return x*b.x + y*b.y;}
};
struct Line
{Point s,e;Line() {}Line(Point _s,Point _e){s = _s;e = _e;}};bool inter(Line l1,Line l2)
{//这要多判断一步,是否是边界点,因为遍历就是从边界开始的,所以要除掉2个端点if (fabs(l1.s.x-l2.s.x)<eps&&fabs(l1.s.y-l2.s.y)<eps||fabs(l1.s.x-l2.e.x)<eps&&fabs(l1.s.y-l2.e.y)<eps)return false;returnmax(l1.s.x,l1.e.x) >= min(l2.s.x,l2.e.x) &&max(l2.s.x,l2.e.x) >= min(l1.s.x,l1.e.x) &&max(l1.s.y,l1.e.y) >= min(l2.s.y,l2.e.y) &&max(l2.s.y,l2.e.y) >= min(l1.s.y,l1.e.y) &&sgn((l2.s-l1.s)^(l1.e-l1.s))*sgn((l2.e-l1.s)^(l1.e-l1.s)) <= 0 &&sgn((l1.s-l2.s)^(l2.e-l2.s))*sgn((l1.e-l2.s)^(l2.e-l2.s)) <= 0;
}
double dist(Point a,Point b)
{return sqrt((b-a)*(b-a));
}Line line[35];
Point po[65];
int n,num,res=INF;
double endx,endy;void sol()
{if (n==0){puts("Number of doors = 1");return;}rep(i,num){int ans=0;Line tel(po[i],Point(endx,endy));rep(j,n){if (inter(tel,line[j])){ans++;}}res=min(ans,res);}printf("Number of doors = %d\n",res+1);
}int main()
{double x1,y1,x2,y2;SI(n);rep(i,n){scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);po[num++]=Point(x1,y1);po[num++]=Point(x2,y2);line[i]=Line(Point(x1,y1),Point(x2,y2));}scanf("%lf%lf",&endx,&endy);sol();return 0;
}

转载于:https://www.cnblogs.com/s1124yy/p/5523059.html

POJ 1066 Treasure Hunt(计算几何)相关推荐

  1. POJ 1066 Treasure Hunt 解题报告

    这道题的大概意思就是在一座金字塔的底部,有一个宝藏,但是底部这一层里面有很多纵横交错的墙,而宝藏就在其中一个由这些墙构成的房间里面.每面墙的两头都在金字塔最外面的四周的墙上.然后需要在每面墙的中间开一 ...

  2. poj 1066 Treasure Hunt

    题目的意思就是从边界某个点出发到目标点问最少要和多少条线段相交. 枚举边界上的点判断就行了. 注意n=0时ans=1 CODE: #include<iostream> #include&l ...

  3. POJ 1066 Treasure

    2次AC.只需注意相同端点不用算通过一面墙,最后加上1即可. // // main.cpp // Richard // // Created by 邵金杰 on 16/8/8. // Copyrigh ...

  4. poj 2398 Toy Storage (计算几何,判断点和线段关系)

    http://poj.org/problem?id=2398 题意大概是说将一个盒子用n个board分成n+1 部分 然后往里面放toy,给定盒子,board,和toy的坐标 问所有的toy放完后,有 ...

  5. poj 2594 Treasure Exploration

    Treasure Exploration Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 6284   Accepted: 2 ...

  6. poj 2594 Treasure Exploration 最小路径覆盖

    题目链接:http://poj.org/problem?id=2594 建图很重要!!! 大致题意: 给出一个由n个顶点m条边组成的有向无环图.求最少可以同时存在多少路径,使得这些路径可以覆盖所有的点 ...

  7. Python游戏编程(七)Sonar Treasure Hunt

    这里将介绍一个采用声纳寻找宝藏的游戏. 首先来了解一下这个游戏涉及到一些概念,并且介绍这个游戏是如何玩的. 目录 (一)游戏说明 (二)导入模块 (三)getNewBoard(): (四)drawBo ...

  8. POJ 1556 The Doors(计算几何+最短路)

    这题就是,处理出没两个点.假设能够到达,就连一条边,推断可不能够到达,利用线段相交去推断就可以.最后求个最短路就可以 代码: #include <cstdio> #include < ...

  9. POJ 2594 Treasure Exploration (可相交最小路径覆盖)

    题意 给你张无环有向图,问至少多少条路径能够覆盖该图的所有顶点--并且,这些路径可以有交叉. 思路 不是裸的最小路径覆盖,正常的最小路径覆盖中两个人走的路径不能有重复的点,而本题可以重复. 当然我们仍 ...

最新文章

  1. MIT录取不再看SAT科目成绩:曾是华裔传统优势,数学等学科测验更是中国留学生强项...
  2. linux shell expect 处理 passwd 交互
  3. iOS 中strong,weak,copy,assign区别
  4. python面试经典问题_Python面试中最常见的25个问题-结束
  5. 渗透测试之子域到父域的横向移动(Sid History)
  6. 【技术好文转载】未来技术前瞻
  7. oracle pctlist,oracle pctfree和pctused详解
  8. python装饰器性能_python装饰器的特性原理详解
  9. docker exec 权限问题,准成,亲自验证过,成功!!!
  10. 在LoadRunner中设置HTTP请求time-out的时间
  11. JavaSE学习--单例设计模式
  12. java 一年 周数_Java时间:获取特定年份的最大周数
  13. php xml与数组的转换函数
  14. Atitit 架构艺术 与架构常见包含的技术 1. 架构的目的是什么??解决的问题 所有的问题都能通过架构解决 2 1.1. 提高可读性 提升可维护性架构 降低技术难度 2 1.2. 提升管理性
  15. 2018DeeCamp笔试题目第一套B卷
  16. sch i699android4,SCH-I699
  17. allegro使用汇总 [转贴]
  18. 7个国外社交网络用户数据情况
  19. Android:音乐播放器(3)—从播放列表到播放歌曲
  20. Web前端:中国环宇科技有限公司网页设计

热门文章

  1. 用pcl读ply文件_一分钟详解PCL中点云配准技术
  2. 台式计算机华硕电源,美声大师+智能电源 华硕台式电脑M51AC
  3. oracle.sql.clob 报错,oracle11g java导出excel报错oracle.sql.CLOB@xxxx问题
  4. 谷歌浏览器chrome安装Hackbar插件方式
  5. 常见网盘和云存储测评和使用方式
  6. k型热电偶材料_热电偶温度计的二三事
  7. JavaScript的new关键字执行过程(1)
  8. Python入门--个数可变的位置参数和关键字参数
  9. poj 1651区间dp
  10. 线性表部分知识点小结