POJ 1066 Treasure Hunt

 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值