CCF-CSP 202006-1线性分类器

import java.util.Scanner;
import java.util.HashMap;
import java.util.Map;
public class Main {
	public static int compute(int a,int b,int c,int x,int y) {
		return a+b*x+c*y;
	}
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		//点的个数
		int SpotNum = s.nextInt();
		//线的条数
		int LineNum = s.nextInt();
		//0代表A 1代表B 第四位表示落在直线上面还是下面
		int[][] Spot = new int[SpotNum][4];
		for(int i=0;i<SpotNum;i++) {
			Spot[i][0]=s.nextInt();
			Spot[i][1]=s.nextInt();
			String str=s.next();
			if(str.equals("A")) Spot[i][2]=0;
			else  Spot[i][2]=1;
		}
		//读线条 A+Bx+Cy=0
		int[][] Line = new int[LineNum][3];
		for(int i=0;i<LineNum;i++) {
			Line[i][0]=s.nextInt();
			Line[i][1]=s.nextInt();
			Line[i][2]=s.nextInt();
		}
		//开始对每根线条进行遍历
		for(int i=0;i<LineNum;i++) {
			for(int j=0;j<SpotNum;j++) {
				if(compute(Line[i][0],Line[i][1],Line[i][2],Spot[j][0],Spot[j][1])>0) {
					//在上面
					Spot[j][3]=1;
				}else Spot[j][3]=0;
			}
			//判断在上面的是否都是同一个A或B 以及在下面的是否都是同一个A或B
			int flag=999;
			boolean flag1=true;
			for(int j=0;j<SpotNum;j++) {
				if(Spot[j][3]==1) {
					if(flag==999) flag = Spot[j][2];
					else {
						if(flag!=Spot[j][2]) {
							System.out.println("No");
							flag1=false;
							break;
						}
					}
				}
			}
			if(flag1) {
				flag=999;
				for(int j=0;j<SpotNum;j++) {
					if(Spot[j][3]==0) {
						if(flag==999) flag = Spot[j][2];
						else {
							if(flag!=Spot[j][2]) {
								System.out.println("No");
								flag1=false;
								break;
							}
						}
					}
				}
				
			}else continue;
			if(flag1)System.out.println("Yes");
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值