http://poj.org/problem?id=1066
这道题从开始看到做出来,我整整用了一个小时。而且还发现,模板真好用,别人发的卡精度等什么的情况,我一个也没遇到!
题意:就是给你一个正方形,然后正方形内有一个金矿,而且内部有墙,让你从正方形的外部出发到达金矿,问你穿过的墙的最少数目。
题目很简单,只是搞了半天才搞懂题目啥意思,哎,我的English啊~
我直接枚举的,不知道还有没有好的方法,暂且记下
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 10000000
const int maxn=32;
struct point
{
double x,y;
}s[2*maxn];
struct Seg
{
point a,b;
}seg[maxn];
//重载最大值、最小值计算函数
double min(double x,double y)
{return x<y?x:y;}
double max(double x,double y)
{return x>y?x:y;}
//判断double型的正数、负数和0,分别相应的返回1、-1和0
int dblcmp(double x)
{
if(x==0) return 0;
return (x>0)?1:-1;
}
//计算叉积
double det(double x1,double y1,double x2,double y2)
{return x1*y2-x2*y1;}
//计算a,b,c三点的叉积,判断a,b,c三点的位置关系
double cross(point a,point b,point c)
{return det(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y);}
//计算两点间的最短距离
double dist(point a,point b)
{return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
//判断线段是否相交,相交为true,不相交为false
bool segcross(point a,point b,point c,point d)
{
int d1,d2,d3,d4;
d1=dblcmp(cross(a,b,c));
d2=dblcmp(cross(a,b,d));
d3=dblcmp(cross(c,d,a));
d4=dblcmp(cross(c,d,b));
if((d1^d2)==-2&&(d3^d4)==-2) return true;
return false;
}
int main()
{
point a;
double x1,y1,x2,y2;
int n;
while(scanf("%d",&n)!=EOF)
{
int k=0;
for(int i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
s[k].x=x1,s[k++].y=y1,s[k].x=x2,s[k++].y=y2;
seg[i].a.x=x1,seg[i].a.y=y1,seg[i].b.x=x2,seg[i].b.y=y2;
}
scanf("%lf%lf",&a.x,&a.y);
if(n==0)
{
printf("Number of doors = 1\n");
continue;
}
int min=inf;
for(int i=0;i<k;i++)
{
int cnt=1;
for(int j=0;j<n;j++)
{
if(segcross(s[i],a,seg[j].a,seg[j].b))
cnt++;
}
if(cnt<min) min=cnt;
}
printf("Number of doors = %d\n",min);
}
return 0;
}