Treasure Hunt--poj1066(最短路加判断线段的关系)
http://poj.org/problem?id=1066
题目大意:有n条线段 他们都在这个房间里 最后有一个点代表起始位置
现在想通过墙出去 他只能爆破每个房间的中点的门 问最少的门通过的
分析: 刚开始就想到暴力写 但是一想好麻烦 头都大了 最后还是暴力 我把边存错了 调试了好久 就过了
先找到每条线段(包括边界)与所有的线段之间的交点求出来 然后从左往右排下序 把中点存到一个结构体里(把边界的点特殊处理一下)
处理所有的中点 能直接相连的就置成1 否则就是INF 最后地杰斯特拉跑一边 把边缘的点比较一下就好
用G++ 交 c++的话 就把fabs改成abs就好 反正它本身就是整形
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include<ctype.h>
- #include<math.h>
- #include<queue>
- #include<algorithm>
- #include<iostream>
- using namespace std;
- #define N 2000
- const double ESP = 1e-;
- #define INF 0x3f3f3f3f
- #define memset(a,b) memset(a,b,sizeof(a))
- int n;
- struct Point
- {
- double x,y;
- int step;
- Point (double x=,double y=):x(x),y(y) {}
- Point operator - (const Point &temp)const
- {
- return Point(x-temp.x,y-temp.y);
- }
- int operator * (const Point &temp)const
- {
- double t=(x*temp.y-y*temp.x);
- if(t>ESP)
- return ;
- if(fabs(t)<ESP)
- return ;
- return -;
- }
- };
- struct node
- {
- Point A,B;
- node (Point A=,Point B=):A(A),B(B) {}
- };
- Point p[N],d[N];
- node a[N];
- Point line(Point u1,Point u2,Point v1,Point v2)///求交点
- {
- Point ret=u1;
- double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
- ret.x+=(u2.x-u1.x)*t;
- ret.y+=(u2.y-u1.y)*t;
- return ret;
- }
- int cmp(const void *aa,const void *bb)
- {
- struct Point *cc,*dd;
- cc=(struct Point *)aa;
- dd=(struct Point *)bb;
- if(cc->x!=dd->x)
- return cc->x-dd->x;
- else
- return cc->y-dd->y;
- }
- int G[N][N];
- void serch(int o)
- {
- for(int i=;i<=o;i++)
- {
- for(int j=;j<=o;j++)
- {
- if(i==j)
- continue;
- int flag=;
- for(int k=;k<n;k++)
- {
- int k1=fabs((d[i]-a[k].A)*(a[k].B-a[k].A)+(d[j]-a[k].A)*(a[k].B-a[k].A));
- int k2=fabs((a[k].A-d[j])*(d[i]-d[j])+(a[k].B-d[j])*(d[i]-d[j]));
- if(k1== && k2==)
- {
- flag=;
- break;
- }
- }
- if(flag==)
- G[i][j]=;
- }
- }
- }
- int vis[N],dis[N];
- void dji(int s,int o)
- {
- memset(vis,);
- for(int i=;i<=o;i++)
- dis[i]=G[s][i];
- for(int i=;i<=o;i++)
- {
- int Min=INF,dist;
- for(int j=;j<=o;j++)
- {
- if(!vis[j] && Min>dis[j])
- {
- Min=dis[j];
- dist=j;
- }
- }
- vis[dist]=;
- for(int j=;j<=o;j++)
- {
- dis[j]=min(dis[j],dis[dist]+G[dist][j]);
- }
- }
- }
- int main()
- {
- double x1,x2,y1,y2;
- while(scanf("%d",&n)!=EOF)
- {
- double x,y;
- for(int i=; i<=n; i++)
- {
- scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
- a[i]=node(Point(x1,y1),Point(x2,y2));
- }
- n=n+;
- a[n++]=node(Point(,),Point(,));
- a[n++]=node(Point(,),Point(,));
- a[n++]=node(Point(,),Point(,));
- a[n++]=node(Point(,),Point(,));
- scanf("%lf %lf",&x,&y);
- int o=;///中点的个数
- int h[N];///在边缘的点
- int aa=;///边缘点的个数
- for(int i=; i<n; i++)
- {
- memset(p,);
- int b=;
- for(int j=; j<n; j++)
- {
- if(i==j)
- continue;
- int k=fabs((a[i].B-a[j].A)*(a[j].B-a[j].A)+(a[i].A-a[j].A)*(a[j].B-a[j].A));
- int kk=fabs((a[j].B-a[i].A)*(a[i].B-a[i].A)+(a[j].A-a[i].A)*(a[i].B-a[i].A));
- if(k!= && kk!=)///如果两个线段相交 求交点
- {
- p[b++]=line(a[i].A,a[i].B,a[j].A,a[j].B);
- }
- }
- qsort(p,b,sizeof(p[]),cmp);///交点从左向右排序
- for(int j=;j<b;j++)///每一条线段的中点
- {
- d[o]=Point((p[j].x+p[j-].x)/2.0,(p[j].y+p[j-].y)/2.0);
- if(d[o].x== || d[o].x== || d[o].y== || d[o].y==)///边界点
- {
- h[aa++]=o;
- }
- o++;
- }
- }
- d[o]=Point(x,y);///起始点
- for(int i=;i<=o;i++)
- {
- for(int j=;j<=o;j++)
- G[i][j]=INF;
- }
- serch(o);///判断这两个中点是否能直接相连
- dji(o,o);///最短路
- int Min=INF;
- for(int i=;i<aa;i++)
- {
- Min=min(Min,dis[h[i]]);
- }
- printf("Number of doors = %d \n",Min);
- }
- return ;
- }
Treasure Hunt--poj1066(最短路加判断线段的关系)的更多相关文章
- Revit API判断直线相交关系移动风管
start ) ); )) )) ); XYZ xyz12 = lCurve1.Curve.get_EndPoint(); XY ...
- POJ 1066 Treasure Hunt(线段相交判断)
Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4797 Accepted: 1998 Des ...
- POJ 1066 - Treasure Hunt - [枚举+判断线段相交]
题目链接:http://poj.org/problem?id=1066 Time Limit: 1000MS Memory Limit: 10000K Description Archeologist ...
- POJ 1066 Treasure Hunt(相交线段&&更改)
Treasure Hunt 大意:在一个矩形区域内.有n条线段,线段的端点是在矩形边上的,有一个特殊点,问从这个点到矩形边的最少经过的线段条数最少的书目,穿越仅仅能在中点穿越. 思路:须要巧妙的转换一 ...
- poj1066 Treasure Hunt【计算几何】
Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8192 Accepted: 3376 Des ...
- POJ 1066--Treasure Hunt(判断线段相交)
Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7857 Accepted: 3247 Des ...
- POJ_1556_The Doors_判断线段相交+最短路
POJ_1556_The Doors_判断线段相交+最短路 Description You are to find the length of the shortest path through a ...
- POJ 2556 (判断线段相交 + 最短路)
题目: 传送门 题意:在一个左小角坐标为(0, 0),右上角坐标为(10, 10)的房间里,有 n 堵墙,每堵墙都有两个门.每堵墙的输入方式为 x, y1, y2, y3, y4,x 是墙的横坐标,第 ...
- 简单几何(线段相交) POJ 1066 Treasure Hunt
题目传送门 题意:从四面任意点出发,有若干障碍门,问最少要轰掉几扇门才能到达终点 分析:枚举入口点,也就是线段的两个端点,然后选取与其他线段相交点数最少的 + 1就是答案.特判一下n == 0的时候 ...
随机推荐
- checkbox设置复选框的只读效果不让用户勾选
在Web开发中,有时候需要显示一些复选框(checkbox),表明这个地方是可以进行勾选操作的,但是有时候是只想告知用户"这个地方是可以进行勾选操作的"而不想让用户在此处勾选(比如 ...
- 洛谷 P2580 于是他错误的点名开始了
题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900). ...
- 30行代码消费腾讯人工智能开放平台提供的自然语言处理API
腾讯人工智能AI开放平台上提供了很多免费的人工智能API,开发人员只需要一个QQ号就可以登录进去使用. 腾讯人工智能AI开放平台的地址:https://ai.qq.com/ 里面的好东西很多,以自然语 ...
- SEO 第九章
SEO第九章 本次课目标: 1. 外部优化之平台优化 2. 如何撰写SEO诊断方案 一.外部平台优化——百度系列平台 百度系列的平台都是属于百度自己的产品,排名都是比较高的,所以我们在做外部推广的 ...
- 安装 配置 IIS
一 .找到 控制面板 ------ 在程序和功能 -----打开或关闭window 功能 :这里可能要等一下 才会显示 . 二‘.找到 Internet信息服务 ,勾选大部分如下图:点击 ...
- strict说明
- CAD交互绘制文字(网页版)
在CAD设计时,需要绘制文字,用户可以设置设置绘制文字的高度等属性. 主要用到函数说明: _DMxDrawX::DrawText 绘制一个单行文字.详细说明如下: 参数 说明 DOUBLE dPosX ...
- 浏览器title失去焦点时改变title
document.addEventListener('visibilitychange', function() { var isHidden = document.hidden; if (isHid ...
- Java BufferedReader文件读取 带缓冲区的字符流
package org.jimmy.autosearch2019.test; import java.io.BufferedReader; import java.io.FileInputStream ...
- QT+常见控件+tab Widget 和Stacked Widget
首先:这里介绍以下tab Widget 和Stacked Widget 之间的区别和使用的方法: tab Widget控件可以直接的进行切换,Stacked Widget却不可以直接在界面上进行切换, ...