【CSP】202006-1线性分类器

题目描述

【题目】:
【CSP】202006-1线性分类器_第1张图片
【CSP】202006-1线性分类器_第2张图片
【CSP】202006-1线性分类器_第3张图片
【CSP】202006-1线性分类器_第4张图片
【CSP】202006-1线性分类器_第5张图片

思路:

创建两个结构体数组,分别存放A类和B类的点坐标。输入直线的参数的时候计算A类和B类中的点分别在直线的什么位置,如果y值大于0,那么结构体中int da=1,其他就da=0。再来判别A类、B类中的点的da是否都一样,如果一样就都输出Yes,要不就输出No.

【代码】:

#include
#include
using namespace std;

int n,m;
struct Point
{
	int x,y;
	char ty;
	int da = 1;
}P[1010],P1[1010]; 

int main()
{
	cin>>n>>m;
	int x=0,z=0;
	for(int i=1;i<=n;i++)
	{
		int a,b;
		char c;
		cin>>a>>b>>c;
		if(c == 'A')
			P[++x].x= a,P[x].y=b,P[x].ty = 'A';
		else if(c == 'B')
			P1[++z].x=a,P1[z].y=b,P1[z].ty='B';
	}
	for(int j=1;j<=m;j++)
	{
		int theta0,theta1,theta2;
		cin>>theta0>>theta1>>theta2;
		for(int i=1;i<=n;i++)
		{
			int re = theta0+theta1*P[i].x+theta2*P[i].y;
			if(re>0)
				P[i].da = 1;
			else
				P[i].da = 0;
			int re1 = theta0+theta1*P1[i].x+theta2*P1[i].y;
			if(re1>0)
				P1[i].da=1;
			else
				P1[i].da=0;
		}
		int d = P[1].da;
		int d1 = P1[1].da;
		int y=1,y1=1;
		for(int k=2;k<=x;k++)
		{
			if(P[k].da==d)
				continue;
			else
			{
				y=0;
				break;
			}
		}
		for(int k=2;k<=z;k++)
		{
			if(P1[k].da==d1)
				continue;
			else
			{
				y1= 0;
				break;
			}
		}
		if(y==1&&y1==1)
			cout<<"Yes"<<endl;
		else
			cout<<"No"<<endl;
	}
}

你可能感兴趣的:(CSP模测)