長方形エリア交差点[ブルーブリッジカップ]

トピックリンク:長方形領域の交差
時間制限:1秒メモリ制限:256 MB

タイトルの説明:
平面上に2つの長方形があり、それらの辺はデカルト座標系のX軸またはY軸に平行です。
長方形ごとに、反対側の頂点のペアの座標を示します.2つの長方形の交差面積を計算するようにプログラムしてください。
入力:
入力には2行のみが含まれ、各行は長方形を表します。
各行には、長方形の相対的な頂点のペアの座標が示され、各点の座標は、絶対値が10 ^ 7を超えない2つの実数で表されます。
出力:
出力には、1つの実数のみが含まれます。これは、交差点の領域であり、小数点以下2桁まで予約されています。

サンプル入力
11 3 3
2 2 44
サンプル出力
1.00

質問の意味:交差する長方形の面積を見つけることです
。最初に交差点を想定し、次に交差する2つの対角点を見つけ、それらが交差しないと判断した場合、0.00を出力し、交差点はこれら2つの点に基づいて交差する長方形の面積を計算します。できる。

質問では、相対的な頂点のペアの座標が示されていますが、それが主対角頂点であるか副対角頂点であるかはわかりません(これはわかりませんか?下の図を参照してください)。一目でわかりますが、重要ではありません。長方形の右上隅の座標を知っている必要があるため、質問には影響しません。x値が最大で、y値も最大です。同様に、長方形の左下隅の座標、x値が最小、y値も最小です。それで大丈夫です。
ここに写真の説明を挿入

最初に入力された相対頂点座標の最初のペアがx1、y1、x2、y2である
と仮定します。この長方形の右上隅の座標点がx、yである
と仮定します。この長方形の左下隅の座標点がxx、yyであると仮定し、
次に長方形の右上隅次の座標点:
x = max(x1、x2)
y = max(y1、y2)
同じ長方形の左下隅の座標点
xx = min(x1、x2)
yy = min(y1、y2)

ここに写真の説明を挿入
この考えによれば、2つの長方形の右上隅と左下隅の座標を見つけることができます。次に、交差する長方形の対角点の座標を見つけることができます。
写真を見てください。
ここに写真の説明を挿入
交差する長方形の左下隅の座標が(a1、b1)であり、右上隅の座標が(a2、b2)であると仮定します。同時に、上の写真を組み合わせて理解することができます。


交差する長方形の左下隅の座標点= 2つの長方形の左下隅の最大座標点交差する長方形の右上の座標点= 2つの長方形の右上隅の最小座標点

上記と組み合わせると、交差する長方形の相対座標を見つけることができます。

a1=max(min(x1,x2),min(x3,x4)); //相交矩形的左下角x坐标
b1=max(min(y1,y2),min(y3,y4)); //相交矩形的左下角y坐标
a2=min(max(x1,x2),max(x3,x4)); //相交矩形的右上角x坐标
b2=min(max(y1,y2),max(y3,y4)); //相交矩形的右上角y坐标

この時点で、基本的に完了です。最後に、2つの長方形が交差しない場合はどうなるかを判断する必要があります。
上の図を組み合わせると、(a1 <a2 && b1 <b2)のみが交差します。そうでない場合、2つの長方形は交差せず、出力0.00になります。 。

完全なコード:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iomanip>
using namespace std;
int main()
{
    
    
    double x1,y1,x2,y2;
    double x3,y3,x4,y4;
    double a1,b1,a2,b2;  //相交矩形的对角坐标点
    while(cin>>x1>>y1>>x2>>y2)
    {
    
    
        cin>>x3>>y3>>x4>>y4;
        a1=max(min(x1,x2),min(x3,x4)); //相交矩形的左下角x坐标
        b1=max(min(y1,y2),min(y3,y4)); //相交矩形的左下角x坐标
        a2=min(max(x1,x2),max(x3,x4)); //相交矩形的右上角x坐标
        b2=min(max(y1,y2),max(y3,y4)); //相交矩形的右上角x坐标
        double area=0;
        area=(a2-a1)*(b2-b1);
        if(a1<a2&&b1<b2)
            cout<<fixed<<setprecision(2)<<area<<endl;
        else
            cout<<"0.00"<<endl;

    }

    return 0;
}

読んだ後は忘れずに気に入ってください、応援よろしくお願いします!
コンピュータ端末の場合は、右下隅に「ワンキートリプル接続」が表示されているので、右クリックしてください[笑]

ここに写真の説明を挿入

いい加減にして!

共に働く!

Keafmd

おすすめ

転載: blog.csdn.net/weixin_43883917/article/details/108923041
おすすめ