ccf 线性分类器
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int main()
{
int i,m,n;
int x,y,ta=0,tb=0;
char s;
int zxa[1001]={0};//A类点横坐标
int zya[1001]={0};//A类点纵坐标
int zxb[1001]={0};//B类点横坐标
int zyb[1001]={0};//B类点纵坐标
cin>>n>>m;//点和查询的个数
for(i=0;i<n;i++)
{
cin>>x>>y>>s;
if(s=='A')//保存A类点
{
zxa[ta]=x;
zya[ta]=y;
ta++;
}
if(s=='B')//保存B类点
{
zxb[tb]=x;
zyb[tb]=y;
tb++;
}
}
int c1,c2,c3;
int c_1[21];//第一个参数
int c_2[21];//第二个参数
int c_3[21];//第三个参数
for(i=0;i<m;i++)
{
cin>>c_1[i]>>c_2[i]>>c_3[i];
}
int judege_a[1001];//判断结果
int judege_b[1001];
for(int j=0;j<m;j++)
{
int flag_A=0,flag_B=0;
for(i=0;i<ta;i++)
{
judege_a[i]=c_1[j]+c_2[j]*zxa[i]+c_3[j]*zya[i];//就该参数下A类点的值
}
for(i=0;i<tb;i++)
{
judege_b[i]=c_1[j]+c_2[j]*zxb[i]+c_3[j]*zyb[i];//就该参数下B类点的值
}
for(i=0;i<ta;i++)//判断A类点是否全大于0或全小于0
{
if(judege_a[i]<0)
{
flag_A++;
}
}
for(i=0;i<tb;i++)//判断B类点是否全大于0或全小于0
{
if(judege_b[i]>0)
{
flag_B++;
}
}
if(flag_A+flag_B==0||flag_A+flag_B==ta+tb)
{
cout<<"Yes";
}
else{
cout<<"No";
}
cout<<endl;
}
return 0;
}