线性分类器(Line) (2020年6月CSP T1)

线性分类器(Line) (2020年6月CSP T1)_第1张图片
思路比较简单
ax+by+c=0 可将点分为 ax+by+c<0 和 ax+by+c>0 两类点。
利用此特征开始解题

#include 
#define N 1001
#define M 21
using namespace std;
typedef struct point
{
	int x;
	int y;
	char type;
 }point;               //记录点的坐标(x,y),以及其点类型 
typedef struct fxy
{
	long long int a;
	long long int b;
    long long int c;
}fxy;                  //记录线性函数的三个参数 
point dian[N];
fxy   f[M];
int n,m;

int judgeP (long long int *a, int len)    //判断数组中数据是否均大于0 (P-positive) 
{
	int j,sum=1,flag=0;
	for (j=1; j<=len; j++)
	if (a[j]>0) sum++;
	if (sum==len) flag=1;
	else flag=0;
	return flag;
} 

int judgeN (long long int *a, int len)    //判断数组中数据是否均小于0 (N-negative) 
{
	int j,sum=1,flag=0;
	for (j=1; j<=len; j++)
	if (a[j]<0) sum++;
	if (sum==len) flag=1;
	else flag=0;
	return flag;
}

int answer (point* a, fxy* b, int i)               //分类A,B点 
{
	int j,l=1,p=1,flag=0,flag1,flag2,flag3,flag4;   //flag1~4用于记录判断结果 
	long long int  A[N]={0}, B[N]={0};
	for (j=1; j<=n; j++)
	{
		if (a[j].type=='A')      //若定义为A类点,则将其线性函数值存于A数组中 
		{
			A[l]=b[i].a+b[i].b*a[j].x+b[i].c*a[j].y;
			l++;
	    }
	    if (a[j].type=='B')      //若定义为B类点,则将其线性函数值存于B数组中 
	    {
	    	B[p]=b[i].a+b[i].b*a[j].x+b[i].c*a[j].y;
	    	p++;
		}
	}
	flag1=judgeP(A,l); flag2=judgeP(B,p);
	flag3=judgeN(A,l); flag4=judgeN(B,p);
	if ((flag1 && flag4) || (flag2 && flag3))  //A为正,B就为负 || A为负,B就为正 
	flag=1;
	else flag=0;
	return flag;
}

int main(int argc, char** argv) {
	
    cin>>n>>m;                    
	int i,j;
	for (i=1; i<=n; i++)
	{
		cin>>dian[i].x>>dian[i].y; 
		cin>>dian[i].type;
	}                              //输入点的信息 
	for (j=1; j<=m; j++)
	{
		cin>>f[j].a>>f[j].b>>f[j].c;
	}                              //输入参数信息 
	for (i=1; i<=m; i++)
	if (answer(dian,f,i)==1)   
	cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
}

线性分类器(Line) (2020年6月CSP T1)_第2张图片
虽然是第一题,但也花了不少时间(因为菜得没法)。总体来说,还是比较清楚思路的。

你可能感兴趣的:(线性分类器(Line) (2020年6月CSP T1))