这个代码是CSP认证的20200601的线性分类器
第一个是C语言的代码
#include <stdio.h>
#define N 1001
char up[N];
char down[N];
//定义全局数组来初始化
int main() {
int n, m, i;
scanf("%d%d", &n, &m);
int x[N], y[N];
char type[N];
for (i = 0; i < n; i++) //注意这里scanf读入的不是纯数字,不会跳过回车,所以这里用getchar来处理回车
{
scanf("%d%d %c", &x[i], &y[i], &type[i]);
getchar();
}
int a, b, c;
int j;
for (i = 0; i < m; i++)
{
scanf("%d%d%d", &c, &a, &b);
for (j = 0; j < n; j++)
{
if (type[j] == 'A')//先判断类型,再判断其相对直线的位置。假如有一个A在直线上方,那么此时直线下方就只能是B,所以数组直接对应赋B。
{
if ((c + a * x[j] + b * y[j]) > 0)
{
up[j] = type[j];
down[j] = 'B';
}
else if ((c + a * x[j] + b * y[j]) < 0)
{
down[j] = type[j];
up[j] = 'B';
}
}
else if (type[j] == 'B')
{
if ((c + a * x[j] + b * y[j]) > 0)
{
up[j] = type[j];
down[j] = 'A';
}
else if ((c + a * x[j] + b * y[j]) < 0)
{
down[j] = type[j];
up[j] = 'A';
}
}
}
for (j = 1; j < n; j++)//最后判断其中一个数组是否都是同一种类型即可
{
if (up[j - 1] != up[j])
{
printf("No\n");
break;
}
else if (j == n - 1)
printf("Yes\n");
}
}
return 0;
}
第二个是C++的代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, m;//输入点的个数和查询数
cin>>n>>m;
int x[n], y[n];//输入点的横纵坐标
char up[n], down[n], type[n];//输入线上方的类型和下方的类型和点的类型
for(int i = 0;i < n;i++)
{
cin>>x[i]>>y[i]>>type[i];
}
int a,b,c;//输入三个线的参数
for(int i = 0;i<m;i++)
{
cin>>a>>b>>c;
for(int j = 0;j < n;j++)
{
if(type[j] == 'A')
{
if(c+b*y[j]+a*x[j] > 0)
{
up[j] = 'A';
down[j] = 'B';
}
else if(c+b*y[j]+a*x[j] < 0)
{
down[j] = 'A';
up[j] = 'B';
}
}
else if(type[j] == 'B')
{
if(c+b*y[j]+a*x[j] > 0)
{
up[j] = 'B';
down[j] = 'A';
}
else if(c+b*y[j]+a*x[j] < 0)
{
down[j] = 'B';
up[j] = 'A';
}
}
}
}
for(int i=0;i<n-1;i++)
{
if(up[i+1] != up[i])
{
cout<<"No"<<endl;
break;
}
else if(i == n-1)
{
cout<<"Yes"<<endl;
break;
}
}
}