CSP认证2020-6(一)
线性分类器解法,代码如下
下面展示一些 内联代码片
。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct point{
int x;
int y;
char c=' ';
}A[1010];
int judge(int a,int b,int z,int x,int y){
if(a+b*x+z*y<0){
//说明该点在直线下方
return -1;
}else return 1;
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d%d %c",&A[i].x,&A[i].y,&A[i].c);//记得%c会读入空格,scanf中间要写空格
}
int a,b,z;
int A1=0;
int B1=0;
int flag=1;
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&z);
flag=1;
A1=0;B1=0;//记录第一个A/B点的位置
for(int j=0;j<n;j++){
if(A[j].c=='A'){
if(A1==0){
A1=judge(a,b,z,A[j].x,A[j].y);
if(A1==B1){//如果被分到一边
cout<<"No"<<endl;
flag=0;
break;
}
}else if(A1!=judge(a,b,z,A[j].x,A[j].y)){//判断剩余点的位置是否符合
cout<<"No"<<endl;
flag=0;
break;
}
}else if(A[j].c=='B'){
if(B1==0){
B1=judge(a,b,z,A[j].x,A[j].y);
if(A1==B1){//如果被分到一边
cout<<"No"<<endl;
flag=0;
break;
}
}else if(B1!=judge(a,b,z,A[j].x,A[j].y)){//判断剩余点的位置是否符合
cout<<"No"<<endl;
flag=0;
break;
}
}
}
if(flag){
cout<<"Yes"<<endl;
}
}
}