POJ 1066

由于到达点时不能绕墙,因为这是无意义的,所以,两点间的最小墙依然是按照直线所穿过的墙计算。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const double eps=0.000000001;
struct point{
	double x,y;
}Point[100],des;
struct edge{
	point start,end;
}Edge[100],Tmp;

int ne,np;

double multi(point p1,point p2, point p0){
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

bool cross(edge v1, edge v2){
    if(max(v1.start.x,v1.end.x)>=min(v2.start.x,v2.end.x)&&
    max(v2.start.x,v2.end.x)>=min(v1.start.x,v1.end.x)&&
    max(v1.start.y,v1.end.y)>=min(v2.start.y,v2.end.y)&&
    max(v2.start.y,v2.end.y)>=min(v1.start.y,v1.end.y)&&
    multi(v2.start,v1.end,v1.start)*multi(v1.end,v2.end,v1.start)>eps&&
    multi(v1.start,v2.end,v2.start)*multi(v2.end,v1.end,v2.start)>eps)
    return true;
    return false;
}

int main(){
	while(scanf("%d",&ne)!=EOF){
		np=0;
		for(int i=0;i<ne;i++){
			scanf("%lf%lf",&Point[np].x,&Point[np].y);
			np++;
			scanf("%lf%lf",&Point[np].x,&Point[np].y);
			np++;
			Edge[i].start=Point[np-2]; Edge[i].end=Point[np-1];
		}
		Point[np].x=0; Point[np].y=0;
		np++;
		Point[np].x=0; Point[np].y=100;
		np++;
		Point[np].x=100; Point[np].y=0;
		np++;
		Point[np].x=100; Point[np].y=100;
		np++;
		scanf("%lf%lf",&des.x,&des.y);
		int ans=1000,tmp;
		for(int i=0;i<np;i++){
			Tmp.start=des; Tmp.end=Point[i]; tmp=0;
			for(int i=0;i<ne;i++){
				if(cross(Tmp,Edge[i]))
				tmp++;
			}
			ans=min(ans,tmp);
		}
		printf("Number of doors = %d\n",ans+1);
	}
}

  

POJ 1066

时间: 2024-10-21 01:02:38

POJ 1066的相关文章

poj 1066 线段相交

链接:http://poj.org/problem?id=1066 Treasure Hunt Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5431   Accepted: 2246 Description Archeologists from the Antiquities and Curios Museum (ACM) have flown to Egypt to examine the great pyramid

POJ 1066 Treasure Hunt(线段相交&amp;&amp;转换)

Treasure Hunt 大意:在一个矩形区域内,有n条线段,线段的端点是在矩形边上的,有一个特殊点,问从这个点到矩形边的最少经过的线段条数最少的书目,穿越只能在中点穿越. 思路:需要巧妙的转换一下这个问题,因为从一个点到终点不可能"绕过"围墙,只能穿过去,所以门是否开在中点是无所谓的,只要求四周线段中点到终点的线段与墙的最少交点个数即可.更进一步,实际上,只需判断四周围墙的所有点与终点的连线与内墙的最少交点加一即可. struct Point{ double x, y; } A,

线段相交 poj 1066

1 // 线段相交 poj 1066 2 // 思路:直接枚举每个端点和终点连成线段,判断和剩下的线段相交个数 3 4 // #include <bits/stdc++.h> 5 #include <iostream> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <algorithm> 9 #include <vector> 10 #include <math.h>

POJ 1066 Treasure Hunt [想法题]

题目链接: http://poj.org/problem?id=1066 -------------------------------------------------------------------------------------------------------- 这题刚看后可能会去纠结如何建图后进行最短路 不过这样做不仅代码会复杂许多 还有可能出现些不好判断的部分 不过再多想一下我们可以发现如下性质 如果起点和终点位于某条障碍线段的两侧 那么这条线段有且仅有一次被穿过 所以只

poj 1066 Treasure Hunt (线段交)

http://poj.org/problem?id=1066 题意:给出一个100*100的正方形区域,通过若干连接区域边界的线段将正方形区域分割为多个不规则多边形小区域,然后给出宝藏位置,要求从区域外部开辟到宝藏所在位置的一条路径,使得开辟路径所需要打通的墙壁数最少("打通一堵墙"即在墙壁所在线段中间位置开一空间以连通外界),输出应打通墙壁的个数(包括边界上墙壁). 思路:用结构体保存中点,然后判断这些点之间能否连通,最短路即可 由于精度问题,在判断线段相交时精度没有处理好导致答案一

POJ 1066 Treasure Hunt

枚举+判断线段相交 #include<cstdio> #include<cmath> #include<cstring> #include<cmath> #include<algorithm> #include<map> #include<vector> using namespace std; const int INF=0x7FFFFFFF; const int maxn=30+10; #define EPS 1e-8

POJ 1066 Treasure Hunt 线段相交判断

判断以宝藏的坐标和中点的坐标为线段的点是否与墙相交,求最少相交的墙的数量 中点算出来,枚举中点和墙 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define eps 1e-8 #define INF 1e9 using namespace std; const int maxn=100; typede

POJ 1066 Treasure Hunt --几何,线段相交

题意: 正方形的房子,给一些墙,墙在区域内是封闭的,给你人的坐标,每穿过一道墙需要一把钥匙,问走出正方形需要多少把钥匙. 解法: 因为墙是封闭的,所以绕路也不会减少通过的墙的个数,还不如不绕路走直线,所以枚举角度,得出直线,求出与正方形内的所有墙交点最少的值,最后加1(正方形边界). 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include

POJ 1066 Treasure Hunt (线段相交)

题意:给你一个100*100的正方形,再给你n条线(墙),保证线段一定在正方形内且端点在正方形边界(外墙),最后给你一个正方形内的点(保证不再墙上) 告诉你墙之间(包括外墙)围成了一些小房间,在小房间内可以从房间边界(墙)的中点走过这堵墙,问你从给定的点走到外墙外最少走过的墙数 题解:注意我们可以从每个房间的墙的中点走出,而不是一整条线段(墙)的中点走出.... 然后我们可以找四周的边界中的每个点与给定点的连线,再与给定的线段找相交最少的交点数就是答案 但是边界每个点是无穷多个,因此我们可以这样