CCF认证202006-1
线性分类器
思路
分别判断A类点和B类点相对于线的位置,判断结果分别用数组shucA[],shucB[]表示。数组有三种值,0表示都在线下,1表示都在线上,-1表示不在同一侧。
代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int shucA[20],shucB[20];
int n,m;
int i,l,count1=0,count2=0;
int x,y,q0,q1,q2;
int a[1000][2],b[1000][2],q[20][3];
char lb;
scanf("%d%d", &n, &m);
for(i=0;i<n;i++)
{
scanf("%d %d %c",&x,&y,&lb);
if(lb=='A')
{
a[count1][0]=x;
a[count1][1]=y;
count1++;
}
if(lb=='B')
{
b[count2][0]=x;
b[count2][1]=y;
count2++;
}
}
for(i=0;i<m;i++)
{
scanf("%d %d %d",&q0,&q1,&q2);
q[i][0]=q0;
q[i][1]=q1;
q[i][2]=q2;
}
//判断A类点(0表示都在线下,1表示都在线上,-1表示不在同一侧)
for(i=0;i<m;i++)
{
if( q[i][0]+q[i][1]*a[0][0]+q[i][2]*a[0][1]>0)
{
shucA[i]=1;//在线上面
for(l=1;l<count1;l++)
{
if( q[i][0]+q[i][1]*a[l][0]+q[i][2]*a[l][1]<0)
{shucA[i]=-1;break;}
}
}
if( q[i][0]+q[i][1]*a[0][0]+q[i][2]*a[0][1]<0)
{
shucA[i]=0;//在线下面
for(l=1;l<count1;l++)
{
if( q[i][0]+q[i][1]*a[l][0]+q[i][2]*a[l][1]>0)
{shucA[i]=-1;break;}
}
}
}
//判断B类点
for(i=0;i<m;i++)
{
if( q[i][0]+q[i][1]*b[0][0]+q[i][2]*b[0][1]>0)
{
shucB[i]=1;//在线上面
for(l=1;l<count2;l++)
{
if( q[i][0]+q[i][1]*b[l][0]+q[i][2]*b[l][1]<0)
{shucB[i]=-1;break;}
}
}
if( q[i][0]+q[i][1]*b[0][0]+q[i][2]*b[0][1]<0)
{
shucB[i]=0;//在线下面
for(l=1;l<count2;l++)
{
if( q[i][0]+q[i][1]*b[l][0]+q[i][2]*b[l][1]>0)
{shucB[i]=-1;break;}
}
}
}
for(i=0;i<m;i++)
{
if(shucA[i]==-1||shucB[i]==-1||shucA[i]==shucB[i])printf("No\n");
else printf("Yes\n");
}
return 0;
}