多个对象求相交问题,多对多难解决,分解为1对多问题,相交矩形内部必然存在一点是所有矩形的内部,一开始就想着一个点遍历所有坐标点
事实上,把内部扩展位边上也算内部,这就要考虑两个矩形只有边相交问题了。
只从左下角点取点,通过小于而不等于右上角点就能解决x1[i] <= x && x < x2[i] && y1[i] <= y && y < y2[i]
注意,从左下角点集合取点 与从右上角点集合去点,判断条件不一样。
import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] x1 = new int[n]; int[] x2 = new int[n]; int[] y1 = new int[n]; int[] y2 = new int[n]; for(int i = 0; i < n; i++){ x1[i] = sc.nextInt(); } for(int i = 0; i < n; i++){ y1[i] = sc.nextInt(); } for(int i = 0; i < n; i++){ x2[i] = sc.nextInt(); } for(int i = 0; i < n; i++){ y2[i] = sc.nextInt(); } int cnt = 0; for(int x : x1){ for(int y : y1){ int temp = 0; for(int i = 0; i < n; i++){ if(x1[i] <= x && x < x2[i] && y1[i] <= y && y < y2[i]){ temp++; } } cnt = Math.max(temp, cnt); } } // for(int x : x2){ // for(int y : y2){ // int temp = 0; // for(int i = 0; i < n; i++){ // // if(x1[i] < x && x <= x2[i] && y1[i] < y && y <= y2[i]){ // temp++; // } // // } // cnt = Math.max(temp, cnt); // } // } System.out.println(cnt); } }