202006-1线性分类器
题目
题目链接
题图:
思路
在输入的时候就将对应的点分成两类。然后输入直线的时候判断这条直线是不是把这两类点分开了,如果能,那就Yes,否则No.
代码
#include
using namespace std;
struct node {
int x, y;
};
int m, n;
const int N = 1e3;
int k = 0, kk = 0;
node type1[N], type2[N];
int main() {
cin >> n >> m;
int xi, yi;
char ti;
for (int i = 0; i < n; i++) {
cin >> xi >> yi >> ti;
if (ti == 'A') {
type1[k].x = xi, type1[k].y = yi;
k++;
}
if (ti == 'B') {
type2[kk].x = xi, type2[kk].y = yi;
kk++;
}
}
int a, b, c;
while (m--) {
int flag = 1;
cin >> a >> b >> c;
/* 如果A类点在上面 */
if (a + type1[0].x * b + type1[0].y * c > 0) {
/* 检查A类是不是全部在上面 */
for (int i = 0; i < k; i++) {
if (a + type1[i].x * b + type1[i].y * c <= 0) flag = 0;
}
/* 检查B类点有没有混到上面的 */
for (int i = 0; i < kk; i++) {
if (a + type2[i].x * b + type2[i].y * c >= 0) flag = 0;
}
}
/* A类点在下面 */
else {
for (int i = 0; i < k; i++) {
if (a + type1[i].x * b + type1[i].y * c >= 0) flag = 0;
}
for (int i = 0; i < kk; i++) {
if (a + type2[i].x * b + type2[i].y * c <= 0) flag = 0;
}
}
if (flag == 1)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}