题目分析:
因为直线上的点代入直线解析式肯定为0,那么在一条直线的两侧的点 代入直线解析式中,要么>0,要么<0
通过判断A集合是否在同一侧,B集合是否在同一侧就可以。
在输入n个点信息的同时,就直接将A类点放入数组a中,B类点放入数组b中,acnt和bcnt就是在记录A类数组和B类数组的个数
设置一个标记布尔值 sign,之后判断A类点是不是在同一侧,B类点是不是在同一侧就好
#include <iostream>
using namespace std;
const int N = 1000;
struct Point {
int x, y;
} a[N], b[N];
int acnt, bcnt;
int main()
{
int n, m;
cin >> n >> m;
acnt = bcnt = 0;
for (int i = 0; i < n; i++) {
int x, y;
char type2[2];
cin >> x >> y >> type2;
if (type2[0] == 'A')
{
a[acnt].x = x;
a[acnt].y = y;
acnt++;
}
else if (type2[0] == 'B')
{
b[bcnt].x = x;
b[bcnt].y = y;
bcnt++;
}
}
for (int i = 1; i <= m; i++)
{
bool side, ans = true;
int t0, t1, t2;
cin >> t0 >> t1 >> t2;
if (acnt)
side = t0 + a[0].x * t1 + a[0].y * t2 > 0;
else
side = t0 + b[0].x * t1 + b[0].y * t2 > 0;
// 判定A点集合是否在同一侧
for (int i = 0; i < acnt; i++)
if (t0 + a[i].x * t1 + a[i].y * t2 > 0 != side)
{
ans = false;
break;
}
// 判定B点集合是否在同一侧
for (int i = 0; i < bcnt; i++)
if (t0 + b[i].x * t1 + b[i].y * t2 > 0 == side)
{
ans = false;
break;
}
printf(ans ? "Yes\n" : "No\n");
}
return 0;
}