CCF-线性分类器

在这里插入图片描述在这里插入图片描述

import java.util.*;

public class Main{
	public static class Node{//点类
		   int x;//横坐标
		   int y;//纵坐标
		   char kind;//类型
		   public Node(int x,int y,char kind){
			   this.x=x;
			   this.y=y;
			   this.kind=kind;
		   }
		   
	}
   public static void main(String[] args){
     ArrayList<Node> nodes1=new  ArrayList<Node>();//A类点
     ArrayList<Node> nodes2=new  ArrayList<Node>();//B类点
     Scanner s= new Scanner(System.in);
     String str=s.nextLine();
     String[] strs=str.split(" ");
     int m= Integer.parseInt(strs[0]);//获得点的个数
     int n= Integer.parseInt(strs[1]);//获得线的个数
     int i=0;
     while(i<m)//输入点
     {
    	 
    	 String[] strs1=s.nextLine().split(" ");
    	 int x=Integer.parseInt(strs1[0]);//横坐标
    	 int y=Integer.parseInt(strs1[1]);//纵坐标
    	 char kind=strs1[2].charAt(0);//类型
    	 Node node=new Node(x,y,kind);
    	 if(kind=='A')//如果是A类点
    		nodes1.add(node);
    	 else
    		nodes2.add(node);
    	 i=i+1;
    	 
     }
     i=0;
     int flag1=0;
	 int flag2=0;
     while(i<n)//输入边
     {
    	 boolean right=true;
    	 String[] strs2=s.nextLine().split(" "); 
    	 int a=Integer.parseInt(strs2[0]);
    	 int b= Integer.parseInt(strs2[1]);
    	 int c=Integer.parseInt(strs2[2]);
    	 Node node1=nodes1.get(0);
    	 Node node2=nodes2.get(0);
    	 if(a+node1.x*b+node1.y*c>0)//A类第一个点在哪一侧
    		 flag1=1;
    	 else
    		 flag1=-1;
    	 if(a+node2.x*b+node2.y*c>0)//B类第一个点在哪一侧
    		 flag2=1;
    	 else
    		 flag2=-1;
    	 System.out.println("flag1 ="+ flag1);
    	 System.out.println("flag2 ="+ flag2);
    	 
    	 if(flag1==flag2)//如果在同一侧
    	 {
    		 System.out.println("No");
    		 i+=1;
    		 continue;
    	 }
    	 int ans=0;
    	 for(int j=1;j<nodes1.size();j++)//A类点
    	 {
    		 ans=a+b*nodes1.get(j).x+c*nodes1.get(j).y;
    		 if((ans>0&&flag1==-1)||(ans<0 && flag1==1)){
    			 right=false;
    			 break;
    		 }
    	 }
    	// System.out.println(right);
    	 
    	 if(right==false)
    	 {
    		 System.out.println("No");
    		 i+=1;
    		 continue;
    	 }
    	 for(int j=1;j<nodes2.size();j++)//B类点
    	 {
    		 ans=a+b*nodes2.get(j).x+c*nodes2.get(j).y;
    		 if((ans>0&&flag2==-1)||(ans<0 && flag2==1)){
    			 right=false;
    			 break;
    		 }
    	 }
    	// System.out.println(right);
    	 if(right==false)
    		 System.out.println("No");
    	 else
    		 System.out.println("Yes");
    	 i+=1;
     }
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值