CCF CSP 2020-6-1 线性分类器 C语言100分
线性分类器 完成时间11-15 16:23 代码长度961B C 正确 100分 耗时15ms 代码长度2.550MB
思路:根据点带入直线表达式>0还是<0判断在直线的哪一侧。因为不知道A和B分别在哪一边,所以有两种情况:
A在下(A0)B在上(B1)
A在上(A1)B在下(B0)
所以A0+B1=n或A1+B0=n即为全部分类正确。
以下为C语言100分答案
#include<stdio.h>
typedef struct line //ax+by+c=0
{
float a;
float b;
float c;
int A0; //标签为A在直线下方的点的个数
int A1; //同上
int B0;
int B1;
}LINE;
typedef struct dot
{
int x;
int y;
char c;
}DOT;
int main()
{
int n,m;
int i,j,t;
scanf("%d %d", &n, &m);
DOT dot[n];
LINE line[m];
for(i=0;i<n;i++)
{
scanf("%d %d %c",&dot[i].x,&dot[i].y,&dot[i].c);
}
for(i=0;i<m;i++)
{
scanf("%f %f %f",&line[i].c,&line[i].a,&line[i].b);
line[i].A0=line[i].A1=line[i].B0=line[i].B1=0;
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
t=dot[j].x*line[i].a+dot[j].y*line[i].b+line[i].c;
if(t<0&&dot[j].c=='A')
{
line[i].A0++;
}
else if(t>0&&dot[j].c=='A')
{
line[i].A1++;
}
else if(t<0&&dot[j].c=='B')
{
line[i].B0++;
}
else if(t>0&&dot[j].c=='B')
{
line[i].B1++;
}
}
}
for(i=0;i<m;i++)
{
if(line[i].A0+line[i].B1==n||line[i].B0+line[i].A1==n)
{
printf("Yes\n");
}
else printf("No\n");
}
return 0;
}