图形题要么你思维好,要么直接画个图很容易看出规律!我比较菜所以我画图
正常情况:无相交,直接进行计算(x2-x1)*(y2-y1)+(x4-x3)*(y4-y3)
特殊的情况,特殊情况是x1小于x4且x3<x2。也就是说上面的矩形的左下角y轴必定低于下面矩形的右上角,且上面矩形的右上角x轴必定大于下面矩形的左下角,但是同样也不能低于下面y轴或者大于右边的x轴(其中一种)。说简单点就是判断有无相交部分,若有则减掉一次即可。
具体的相交四种情况如上图所示,红色图形和蓝色图形是相对而言的。
如果你看完还是很懵逼不要紧,先把原来的面积计算出来,接着排序,相交时只需要判断哪个比较大,用大的减去小的就可以得到高和宽。
最重要的就是把两个矩形的位置确定好,这里我们使用Lambda表达式。👇
Arrays.sort(arr,(x,y)->Integer.compare(x[0],y[0]));
相对而言左边的总是在arr【0】,接下来的你就可以用你的方法尝试解决。
无论哪种情况绿色矩形左边x轴最小,选取黄色和绿色最小的右边x轴减去即可得到宽。 高度情况有两种,所以都需要判断,用上面较大的y轴减去下面较大的y轴即可。就算绿色矩形在黄色矩形里面依然
粗黄色即为可能的小x轴,粗红色必定为大x轴,所以宽必定为红绿中的最大x-黄x
以此类推
代码如下👇
public static void main(String[] args) {Scanner scanner =new Scanner(System.in);int[][] arr=new int[2][4];for (int i = 0; i < 2; i++) {for (int j = 0; j < 4; j++) {arr[i][j]=scanner.nextInt();}}Arrays.sort(arr,(x,y)->Long.compare(x[0],y[0]));long area=(arr[0][2]-arr[0][0])*(arr[0][3]-arr[0][1])+(arr[1][2]-arr[1][0])*(arr[1][3]-arr[1][1]);//计算面积if (arr[1][0]>=arr[0][2]) {//右边矩形右下y点和左边矩形右上x点System.out.println(area);}else {int w=Math.min(arr[0][2],arr[1][2])-arr[1][0];//右边减左边 int h=Math.min(arr[0][3],arr[1][3])-Math.max(arr[0][1],arr[1][1]);//(上减下)area-=w*h;System.out.println(area);}scanner.close();}
留了BUG,请检查