方法一:
#include<iostream>
#include<vector>
#include<unordered_map>
#include<algorithm>
#include<queue>
using namespace std;
int main() {
int n; //点的个数
int m; //查询的个数
cin >> n >> m;
vector<int> x(n); //点的横坐标
vector<int> y(n); //点的纵坐标
vector<char> type(n); //点的类别
for (int i = 0; i < n; i++)
{
cin >> x[i] >> y[i] >> type[i];
}
char firtype = type[0]; //记录第一个数据的类别
bool firflag; //true表示第一个数据在直线上方,false表示在直线下方
string ans;
int o0, o1, o2; //查询中给定直线的三个参数
for (int i = 0; i < m; i++)
{
cin >> o0 >> o1 >> o2;
firflag = o0 + o1 * x[0] + o2 * y[0] > 0 ? true : false;
ans = "Yes";
for (int j = 1; j < n; j++)
{
bool tempflag = o0 + o1 * x[j] + o2 * y[j] > 0 ? true : false;
if ((firflag == tempflag && firtype == type[j]) || (firflag != tempflag && firtype != type[j]))
//前者说明都在直线的同一边,而且类别相同;后者说明不在直线的同一边,类别也不同
{
continue;
}
else
{
ans = "No";
break;
}
}
cout << ans << endl;
}
return 0;
}
有点讨厌这种题目,虽然不难,题意也不难理解,但写起来就是感觉很繁琐= =
每次查询前记录下第一个数据在直线的上边还是下边(将点带入直线,大于0就说明在直线上边,反之说明在直线下边)和该数据的类别,然后遍历每个数据,如果和第一个数据在同一边并且类别相等,就说明他们都是一个类;如果和第一个数据不在同一边并且类别不同,就说明他们是两个类。
以上的两种情况都能够说明所遍历到的数据的分类是正确的,但是一旦出现了一个不满足以上两个条件的数据,就说明当前的直线不能完美地分割A类和B类。