完整题目都在图片里,谢谢。
题目完整了么?下面没有explanation之类的了?目测就是判断点对和多边形的边有没有交点
#include <stdio.h>
#include <iostream>
using namespace std;
struct point
{
double x,y;
};
struct segment
{
point begin,end;
};
double min(double x,double y)
{
return x<y?x:y;
}
double max(double x,double y)
{
return x>y?x:y;
}
bool onsegment(point pi,point pj,point pk) //判断点pk是否在线段pi pj上
{
if(min(pi.x,pj.x)<=pk.x&&pk.x<=max(pi.x,pj.x))
{
if(min(pi.y,pj.y)<=pk.y&&pk.y<=max(pi.y,pj.y))
{
return true;
}
}
return false;
}
double direction(point pi,point pj,point pk) //计算向量pkpi和向量pjpi的叉积
{
return (pi.x-pk.x)*(pi.y-pj.y)-(pi.y-pk.y)*(pi.x-pj.x);
}
bool judge(point p1,point p2,point p3,point p4) //判断线段p1p2和p3p4是否相交
{
double d1 = direction(p3,p4,p1);
double d2 = direction(p3,p4,p2);
double d3 = direction(p1,p2,p3);
double d4 = direction(p1,p2,p4);
if(d1*d2<0&&d3*d4<0)
return true;
if(d1==0&&onsegment(p3,p4,p1))
return true;
if(d2==0&&onsegment(p3,p4,p2))
return true;
if(d3==0&&onsegment(p1,p2,p3))
return true;
if(d4==0&&onsegment(p1,p2,p4))
return true;
return false;
}
int main()
{
int n, m;
cin >> n >> m;
point * v = new point[n];
point * p = new point[m];
for (int i = 0; i < n; i++)
{
int x, y;
cin >> x >> y;
v[i].x = x;
v[i].y = y;
}
for (int i = 0; i < m; i++)
{
int x, y;
cin >> x >> y;
p[i].x = x;
p[i].y = y;
}
int cnt = 0;
for (int a = 0; a < m - 1; a++)
for (int b = a + 1; b < m; b++)
{
int flag = 0;
for (int c = 0; c < n - 1; c++)
{
if (judge(p[a], p[b], v[c], v[c + 1]))
{ flag = 1; break; }
}
if (!flag)
if (judge(p[a], p[b], v[0], v[n-1])) flag = 1;
if (!flag) cnt++;
}
cout << cnt << endl;
return 0;
}