试题编号:202006-1
试题名称:线性分类器
思路:
主要先以第一个输入点确定好两类标准。比如我以char c1,c2;为两类标准,我规定了c1表示的类别始终是a0+a1x+a2y>0,c2表示的类别始终是a0+a1x+a2y<0。关键在于第一个输入点满足哪个方程,如果满足c1类别,那么把第一个输入点的类型A(B)赋给c1,c2则为B(A);反之,类推即可。
代码:
#include <iostream>
using namespace std;
struct node{
int x;
int y;
int res;
char type;
};
struct line{
int a0;
int a1;
int a2;
};
//此题关键在于解决一个初始标准条件
int main()
{
int n,m,i,j;
cin>>n>>m; //输入n个点,m个查询
node p[n];
line l[m];
char c1,c2; //两个标准,c1为正,c2为负
bool flag;
for(i=0;i<n;i++)
cin>>p[i].x>>p[i].y>>p[i].type;
for(i=0;i<m;i++)
cin>>l[i].a0>>l[i].a1>>l[i].a2;
//计算
for(i=0;i<m;i++)
{
flag = true;
//计算初始点 确定一个标准 c1是正的,c2是负的
p[0].res = l[i].a0+l[i].a1*p[0].x+l[i].a2*p[0].y;
if(p[0].res>0 && p[0].type=='A') {c1='A';c2='B';}
if(p[0].res>0 && p[0].type=='B') {c1='B';c2='A';}
if(p[0].res<0 && p[0].type=='A') {c1='B';c2='A';}
if(p[0].res<0 && p[0].type=='B') {c1='A';c2='B';}
for(j=1;j<n;j++)
{
p[j].res = l[i].a0+l[i].a1*p[j].x+l[i].a2*p[j].y;
if(p[j].res<0 && p[j].type == c1)
{
cout<<"No"<<endl;
flag = false;
break;
}
if(p[j].res>0 && p[j].type == c2)
{
cout<<"No"<<endl;
flag = false;
break;
}
}
if(flag) cout<<"Yes"<<endl;
}
return 0;
}