zl程序教程

您现在的位置是:首页 >  其他

当前栏目

基础练习 矩形面积交 (分类讨论)

基础 分类 练习 讨论 矩形 面积
2023-09-11 14:17:18 时间
  基础练习 矩形面积交  
时间限制:1.0s   内存限制:512.0MB
      
问题描述
  平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入格式
  输入仅包含两行,每行描述一个矩形。
  在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
输出格式
  输出仅包含一个实数,为交的面积,保留到小数后两位。
样例输入
1 1 3 3
2 2 4 4
样例输出
1.00
 
析:很简单的一个题,只要分类讨论即可,一种就是面积为 0,只要判断是不是没有交点就好,这就只要判断某一个的最小的 x 是不是大于另一个的最大的 x,同理 y 也是,剩下就情况就是相交的,求相交的面积,这个更容易,只要求出每个两个矩形最小的里面最大的值与最大里面的最小值差的绝对值就是长度和宽。但是尤其要注意的是 System.out.println(0.00),输出的答案是 0.0 而不是 0.00 ,所以这是一个我不知道的,第一次只得了 57。我又检查了一下代码,没有发现错误,又看了数据才知道,原来是这个问题,对 Java 真是不了解。。。
代码如下:
import java.util.*;

class Point{
  public double x, y;
  Point(double x, double y){ this.x = x;  this.y = y; }
};

public class Main{
  public static void main(String []args){
    Scanner cin = new Scanner(System.in);
    Point []a = new Point[4];
    for(int i = 0; i < 4; ++i) a[i] = new Point(cin.nextDouble(), cin.nextDouble());
    for(int i = 0; i < 4; i += 2){
      if(a[i].x > a[i+1].x){
        double t = a[i].x;  a[i].x = a[i+1].x;  a[i+1].x = t;
      }
      if(a[i].y > a[i+1].y){
        double t = a[i].y;  a[i].y = a[i+1].y;  a[i+1].y = t;
      }
    }
    if(a[0].x >= a[3].x || a[0].y >= a[3].y || a[1].x <= a[2].x || a[1].y <= a[2].y){
      System.out.println("0.00");  return ;
    }
    double x = Math.max(a[0].x, a[2].x) - Math.min(a[1].x, a[3].x);
    double y = Math.max(a[0].y, a[2].y) - Math.min(a[1].y, a[3].y);
    System.out.printf("%.2f\n", Math.abs(x * y));
  }
}