CSP-线性分类器Python实现

问题描述:就是判断给定的直线能否将A,B俩类点分开
思路:一条直线可以将俩类点分开说明其中有一类点在这条直线的上方并且另一类点在这条直线的下方。点在直线上方就是将该点坐标代入直线方程大于0,在下方就是小于0,这道题我们只需要分别记录A和B类的点在直线一方(我用的上方)的数量就行因为如果A在上方的数量等于A类点的数量并且B在直线上方的数量为0则说明该直线可以将A,B分隔开。

n,m = map(int,input().split())
numsA = []  # 存放A类的点
numsB = []  # 存放B类的点
lines = []  # 存放直线
result = []  # 存放结果
for i in range(n):
    temp = list(input().split())
    # A和B类点分开存放
    if temp[2] == 'A':
        numsA.append(temp)
    else:
        numsB.append(temp)
for i in range(m):
    temp = list(map(int,input().split()))
    lines.append(temp)
for templ in lines:
    sumA = 0
    sumB = 0
    # 只记录在直线上方的点的数量
    for tempA in numsA:
        s = templ[0]+int(tempA[0])*templ[1]+int(tempA[1])*templ[2]
        if s>0:
            sumA += 1
    for tempB in numsB:
        s = templ[0]+int(tempB[0])*templ[1]+int(tempB[1])*templ[2]
        if s>0:
            sumB += 1
    # 如果A类中在直线上方的点的数量为A类点的个数并且B类在直线上方的点的数量为0
    # 或者B类中在直线上方的点的数量为A类点的个数并且A类在直线上方的点的数量为0
    if (sumA == len(numsA) and sumB == 0) or (sumB == len(numsB) and sumA==0):
        result.append('Yes')
    else:
        result.append('No')
for j in result:
    print(j)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值