永利平台娱乐输入一些点,直线相交判断+dijkst

2020-01-05 19:23 来源:未知

题目链接:

POJ 1626 有程序求解析。!!!!!! 30C
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long lld;
#define mp make_pair
#define pb push_back
#define X first
#define Y second
#define eps 1e-8
#define pi acos
int Sig
{
if(a < -eps)
return -1;
return a > eps;
}
struct Point
{
double x,y;
Point(){}
Point(double x0,double y0):x{}
void in()
{
scanf("%lf %lf",&x,&y);
}
double len()
{
return sqrt;
}
Point operator -
{
return Point(x-pt.x,y-pt.y);
}
};
struct Edge
{
int v,next;
}edge[1000010];
int head[110];
int pos;
void insert(int x,int y)
{
edge[pos].v=y;
edge[pos].next=head[x];
head[x]=pos++;
}
bool in[20];
struct Event
{
double s;
int flag,id;
Event(){}
Event(double s0,int flag0,int id0):s,flag,id{}
}pp[110];
int qq;
bool cmp(Event a,Event b)
{
return a.s < b.s;
}
Point p[110];
int T1,T2;
int dp[1<int dfs(int mask,int flag)
{
if(dp[mask][flag] != -1)
return dp[mask][flag];
if(flag == 0)
{
if(!(mask&T1))
return 0;
for(int k=0;k if(mask&(1 {
for(int i=head[k];i;i=edge[i].next)
{
int to=edge[i].v;
int next=mask;
next|=1 next^=1 next|=to;
next^=to;
if(!dfs(next,flag^1))
{
dp[mask][flag]=1;
return 1;
}
}
}
dp[mask][flag]=0;
return 0;
}
else
{
if(!(mask&T2))
return 0;
for(int k=8;k if(mask&(1 {
for(int i=head[k];i;i=edge[i].next)
{
int to=edge[i].v;
int next=mask;
next|=1 next^=1 next|=to;
next^=to;
if(!dfs(next,flag^1))
{
dp[mask][flag]=1;
return 1;
}
}
}
dp[mask][flag]=0;
return 0;
}
return "you are so pretty";
}
int main()
{
T1=T2=0;
for(int i=0;i T1+=1 for(i=8;i T2+=1 while(scanf("%lf %lf",&p[0].x,&p[0].y)!=EOF)
{
for(int i=1;i p[i].in();
memset(head,0,sizeof;
pos=1;
for(i=0;i {
qq=0;
int T=0;
memset(in,false,sizeof;
for(int j=0;j {
if
continue;
double d=(p[i]-p[j]).len();
double add=asin;
double angle=atan2(p[j].y-p[i].y,p[j].x-p[i].x);
pp[qq++]=Event(angle-add-eps,-1,j);
pp[qq++]=Event(angle+add+eps,1,j);
}
for(j=0;j {
while(pp[j].s pp[j].s+=pi*2;
while(pp[j].s > pi*2)
pp[j].s-=pi*2;
}
sort(pp,pp+qq,cmp);
for(j=0;j<qq;j++)
{
int id=pp[j].id;
if(pp[j].flag == -1)
in[id]=true;
else
in[id]=false;
}
int mask;
for(j=0;j<qq;j++)
{
int id=pp[j].id;
mask=0;
for(int k=0;k<16;k++)
if
mask|=1<<k;
insert;
if(pp[j].flag == -1)
in[id]=true;
else
in[id]=false;

题目链接:pku1066(经典)

题目:pku1556

题目大意: 输入一些点,求最多有几点共线。

 } } memset(dp,-1,sizeof; if(dfs((1<<16)-1,0)) printf; else printf("WHITEn");}return 0;

代码一:线段相交+枚举

方法:直线相交判断+dijkstra算法

注意:本题的输入是比较的繁琐的,需要好好的控制。特别注意的是x,y可能是负数。

}

//0 <= n <= 30  

思路:把每个门的两点看成图中的一个点,构造一个以两点距离为权值的图(如果不可直达,记为INF),

因此,当输入一个减号时,不一定是这个测试样例结束。这样容易造成WA.

不知道这个游戏是怎么执行的。有没有大神来提点一下。!谢谢

#include<iostream>
#include <algorithm>
#include<cmath>
using namespace std;
struct point
{   double x,y;  };
struct line
{   point s, e;  };
double max(double a,double b)
{    return a>b?a:b;        }
double min(double a,double b)
{    return a<b?a:b;        }
//计算叉积
double multi(point p0,point p1,point p2)
{   return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}
//判断线段相交
bool is_cross(point s1,point e1,point s2,point e2)
{
   return max(s1.x,e1.x)>=min(s2.x,e2.x)&&
          max(s2.x,e2.x)>=min(s1.x,e1.x)&&
          max(s1.y,e1.y)>=min(s2.y,e2.y)&&
          max(s2.y,e2.y)>=min(s1.y,e1.y)&&
          multi(s2,e1,s1)*multi(e1,e2,s1)>=0&&
          multi(s1,e2,s2)*multi(e2,e1,s2)>=0;
}
int main()
{
    int n;
    line ss[35];
    point p;
    int i,j,k;
    int node1,node2,min;
    while(cin>>n)
    {
        for(i=0;i<n;i++)
           cin>>ss[i].s.x>>ss[i].s.y>>ss[i].e.x>>ss[i].e.y;
        cin>>p.x>>p.y;min=100;
        for(i=0;i<n;i++)
        {
            node1=0;node2=0;
            for(j=0;j<n;j++)
            {
                if(is_cross(ss[i].s,p,ss[j].s,ss[j].e))node1++;
                if(is_cross(ss[i].e,p,ss[j].s,ss[j].e))node2++;
            }
永利平台娱乐,            if(node1<min)min=node1;
            if(node2<min)min=node2;
        }
        if(n)printf("Number of doors = %dn",min);
        else printf("Number of doors = 1n");
    }
    return 0;
}

再用dijkstra算法求出两个端点点的最短路。

思路:每次把一个顶点作为起点,计算其余点与该点所形成的直线的斜率。

代码二:

注意:不要用memset初始化g,d;用memset初始化为非0值时,其值并非我们想象的,尽管那值很稳定。

TAG标签:
版权声明:本文由永利平台娱乐发布于新闻动态,转载请注明出处:永利平台娱乐输入一些点,直线相交判断+dijkst