202006-1线性分类器Java

总结:思路还可以,将A类点带入线,大于零就记下true,小于零就记录false.
B类点也代入线,大于0也记录true,小于零记录false

成功分割的条件是A的记录里全是true或全是false,B里也是,并且AB不能同时全是false或同时全是true。
出错的地方就是开始只定义了一个ans,A是不是全是true已经判断好了,结果下面到B时又改了A的判断结果。解决方法是定义了一个ansA,一个ansB。还有在循环里可以大胆定义变量,编译器不会误会的(遵循用时定义原则)。

import java.util.ArrayList;
import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		int n=0,m=0;
		Scanner in=new Scanner(System.in);
		n=in.nextInt();
		m=in.nextInt();
		int[] x=new int[n];
		int[] y=new int[n];
		char[] type=new char[n];
		for(int i=0;i<n;i++)
		{//读入点
			x[i]=in.nextInt();
			y[i]=in.nextInt();
			type[i]=in.next().charAt(0);
		}
		
		int[] w1=new int[m];
		int[] w2=new int[m];
		int[] w3=new int[m];
		for(int i=0;i<m;i++)
		{//读入线
			w1[i]=in.nextInt();
			w2[i]=in.nextInt();
			w3[i]=in.nextInt();
		}
		
		ArrayList<Boolean> resultA=new ArrayList<Boolean>();
		ArrayList<Boolean> resultB=new ArrayList<Boolean>();//在循环外面定义能省空间吗?(不能,还忘了clear)
		for(int line=0;line<m;line++)//依次判断每一根线
		{
			
			for(int i=0;i<n;i++)
			{
				if(type[i]=='A')
				{
					resultA.add(w1[line]+w2[line]*x[i]+w3[line]*y[i]>0);
				}
				if(type[i]=='B')
				{
					resultB.add(w1[line]+w2[line]*x[i]+w3[line]*y[i]>0);
				}
			}
			Boolean ansA=false;
			Boolean ansB=false;
			for(int i=1;i<resultA.size();i++)//数组和字符串是长度。容器是size
			{
				if(resultA.get(0)==resultA.get(i))
				{
					ansA=true;
				}
				else
				{
					ansA=false;
					break;
				}
			}
			for(int i=1;i<resultB.size();i++)//数组和字符串是长度。容器是size
			{
				if(resultB.get(0)==resultB.get(i))
				{
					ansB=true;
				}
				else
				{
					ansB=false;
					break;
				}
			}
			Boolean ans=false;
			if((ansA==true)&&(ansB==true)&&(resultB.get(0)!=resultA.get(0)))
			{
				ans=true;
			}
			//输出第i跟线判断结果
			if(ans==false)
			{
				System.out.println("No");
			}
			else
			{
				System.out.println("Yes");
			}
			resultA.clear();
			resultB.clear();
		}
	}
}
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页