题目分析
先将输入的A、B两类点分别保存起来,当输入直线的三个参数之后,去判断此直线能否进行分类。判断方法是将每个点代入直线中,进行计算,然后看计算结果的正负性,若A类点的计算结果的符号和B类点计算结果的符号相反,那么说明此条直线可以进行分类,否则不能分类。
源代码
#include<iostream>
#include<vector>
using namespace std;
int c1, c2, c3;
void Calculate(vector<pair<int, int>> v, int& flag) {
for (auto i : v) {
if (c1 + c2 * i.first + c3 * i.second > 0) {
if (flag == -1) { //上一次的计算结果小于0,这一次大于0,说明无法分类
flag = 0;
return;
}
else
flag = 1;
}
else {
if (flag == 1) {
flag = 0;
return;
}
else
flag = -1;
}
}
}
int main() {
int n, m;
int x, y;
char type;
vector<pair<int, int> > v1, v2; //分别存放A类点和B类点
int flag1 = 0, flag2 = 0;
cin >> n >> m;
while (n--) {
cin >> x >> y >> type;
if (type == 'A')
v1.push_back(make_pair(x, y));
else
v2.push_back(make_pair(x, y));
}
while (m--) {
cin >> c1 >> c2 >> c3;
flag1 = 0;
flag2 = 0;
Calculate(v1, flag1);
Calculate(v2, flag2);
if (flag1 * flag2 >= 0)
cout << "No" << endl;
else
cout << "Yes" << endl;
}
return 0;
}
/*
9 3
1 1 A
1 0 A
1 -1 A
2 2 B
2 3 B
0 1 A
3 1 B
1 3 B
2 0 A
0 2 -3
-3 0 2
-3 1 1
*/