202006-1線性分類器Java

傾聽雪的聲音發表於2020-09-26

總結:思路還可以,將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();
		}
	}
}

相關文章