CCF认证——线性分类器(java)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* 1. 判断哪些点在直线的同一边:将该点的横坐标x带入直线方程,若求得的y
* 大于该点的纵坐标,则满足这个条件的所有的点在直线的下方,否则在
* 直线的上方
*/
public class Main {
public static void main(String[] args) {
// write your code here
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
boolean flag = true;
boolean flag1 = true;
//暂时保存信息集1
List<String> list = new ArrayList<>();
//暂时保存信息集2
List<String> list1 = new ArrayList<>();
double k = 0;
String[] str = new String[n];
int[][] nums = new int[n][2];
int[][] num = new int[m][3];
for (int i = 0; i < n; i++) {
nums[i][0] = scanner.nextInt();
nums[i][1] = scanner.nextInt();
str[i] = scanner.next();
}
for (int i = 0; i < m; i++) {
num[i][0] = scanner.nextInt();
num[i][1] = scanner.nextInt();
num[i][2] = scanner.nextInt();
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
k = -(num[i][0]+num[i][1]*nums[j][0])/(double)num[i][2];
//将点根据在直线的哪一边分类
if ((k-nums[j][1])>1e-6)
list.add(str[j]);
if (nums[j][1]-k>1e-6)
list1.add(str[j]);
}
for (int j = 0; j < list.size(); j++) {
if (!list.get(j).equals(list.get(0))){
flag = false;
break;
}
}
for (int j = 0; j < list1.size(); j++) {
if (!list1.get(j).equals(list1.get(0))){
flag1 = false;
break;
}
}
if (flag == false||flag1 == false)
System.out.println("No");
else
System.out.println("Yes");
flag = true;
flag1 = true;
list.removeAll(list);
list1.removeAll(list1);
}
}
}