题目描述:
分析:建立两个int数组,一个放x坐标,一个放y坐标,建立一个char型数组,放点的类别。根据输入的每一条线,把这些点分为两类,ax+by+c>0为一类,ax+by+c<0为一类。逻辑上可分为两种:
1.函数值>0 且 点的类型为A(即函数值小于0 且 点的类型为B)
2.函数值<0 且 点的类型为B(即函数值大于0 且 点的类型为B)
根据第一个点的类型,结合判断第一个点是在直线上方(左方)还是在直线下方(右方),即可确定A类型和B类型的点是哪种情况。进行分类即可
满分C++代码:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int n,m,a,b,c;
int x[1000+10],y[1000+10],flag[1000+10];
char type[1000+10];
cin>>n>>m;
for(int i=0; i<n; i++)
{
cin>>x[i]>>y[i]>>type[i];
}
for(int i=0; i<m; i++)
{
int j=0;
cin>>c>>a>>b;
if(a*x[0]+b*y[0]+c>0)
{
if(type[0]=='A')
{
for(j=0; j<n; j++)
{
if(a*x[j]+b*y[j]+c>0)
{
if(type[j]=='B')
{
cout<<"No"<<endl;
break;
}
}
else{
if(type[j]=='A'){
cout<<"No"<<endl;
break;
}
}
}
if(j==n)
{
cout<<"Yes"<<endl;
}
}
else{
for(j=0; j<n; j++)
{
if(a*x[j]+b*y[j]+c>0)
{
if(type[j]=='A')
{
cout<<"No"<<endl;
break;
}
}
else{
if(type[j]=='B'){
cout<<"No"<<endl;
break;
}
}
}
if(j==n)
{
cout<<"Yes"<<endl;
}
}
}
else{
if(type[0]=='A')
{
for(j=0; j<n; j++)
{
if(a*x[j]+b*y[j]+c>0)
{
if(type[j]=='A')
{
cout<<"No"<<endl;
break;
}
}
else{
if(type[j]=='B'){
cout<<"No"<<endl;
break;
}
}
}
if(j==n)
{
cout<<"Yes"<<endl;
}
}
else{
for(j=0; j<n; j++)
{
if(a*x[j]+b*y[j]+c>0)
{
if(type[j]=='B')
{
cout<<"No"<<endl;
break;
}
}
else{
if(type[j]=='A'){
cout<<"No"<<endl;
break;
}
}
}
if(j==n)
{
cout<<"Yes"<<endl;
}
}
}
}
return 0;
}