CCF模拟题 :202006-1 线性分类器
**思路:**1.将输入按照点和分类线分别创建两个结构体或者类也行。
2.点与线的位置有在线上和线下两种情况,对于一条线,第一个点坐标带入线表达式如果结果大于等于0,那么在线上侧,则判断与第一个点类别相同的点是否存在带入先表达式小于0(在线下)那么这条线就不能正确分类,将线属性设置为false;如果与第一个点类相同的点都在线上,那么判断与第一个点类别不相同的点是否在线上如果在,那么这条线不能正确分类,将线属性设置为false。第一个点在线下与上述情况相反判断即可。
3.根据第二步的判断输出结果。
我的错误: 输入时把点的数量n,线的数量m的值改变了导致后来遍历迭代器的时候无法正确进入循环,因为经过输入循环m=n=0哈哈哈哈哈我是个憨憨!!!!后面我竟然还在用m,n!我好憨哦!!!我貌似经常这样憨!~气死!!
代码如下:
#include<iostream>
#include<vector>
using namespace std;
struct point {
int x;
int y;
char ch;
};
struct line {
int a0;
int a1;
int a2;
bool flag;
};
int main()
{
int n, m;
cin >> n >> m;
int n0, m0;
n0 = n;
m0 = m;
vector<point> p;
while (n0--)
{
point p0;
int x0, y0;
char ch0;
cin >> x0 >> y0 >> ch0;
p0.x = x0;
p0.y = y0;
p0.ch = ch0;
p.push_back(p0);
}
vector<line> l;
while (m0--)
{
line l0;
int a00, a11, a22;
cin >> a00 >> a11 >> a22;
l0.a0 = a00;
l0.a1 = a11;
l0.a2 = a22;
l0.flag = true;
l.push_back(l0);
}
char a;
for (int j = 0; j < m; j++)
{
if (l[j].a0 + l[j].a1*p[0].x + l[j].a2*p[0].y >= 0)
{
a = p[0].ch;
for (int i = 0; i < n; i++)
{
if (l[j].a0 + l[j].a1*p[i].x + l[j].a2*p[i].y < 0 && p[i].ch == a)
{
l[j].flag = false;
break;
}
if (p[i].ch != a && l[j].a0 + l[j].a1*p[i].x + l[j].a2*p[i].y >= 0)
{
l[j].flag = false;
break;
}
}
}
else {
a = p[0].ch;
for (int i = 0; i < n; i++)
{
if (l[j].a0 + l[j].a1*p[i].x + l[j].a2*p[i].y >= 0 && p[i].ch == a)
{
l[j].flag = false;
break;
}
if (p[i].ch != a && l[j].a0 + l[j].a1*p[i].x + l[j].a2*p[i].y < 0)
{
l[j].flag = false;
break;
}
}
}
}
for (int j = 0; j < m; j++)
{
if (l[j].flag)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}
记录一下菜鸡的憨憨历程~加油哇,做个稳重不憨憨的大人哇!!