題目:R – Rectangles
Given two rectangles and the coordinates of two points on the diagonals of each rectangle,you have to calculate the area of the intersected part of two rectangles. its sides are parallel to OX and OY .
Input
Input The first line of input is 8 positive numbers which indicate the coordinates of four points that must be on each diagonal.The 8 numbers are x1,y1,x2,y2,x3,y3,x4,y4.That means the two points on the first rectangle are(x1,y1),(x2,y2);the other two points on the second rectangle are (x3,y3),(x4,y4).
Output
Output For each case output the area of their intersected part in a single line.accurate up to 2 decimal places.
Sample Input
1.00 1.00 3.00 3.00 2.00 2.00 4.00 4.00
5.00 5.00 13.00 13.00 4.00 4.00 12.50 12.50
Sample Output
1.00
56.25
大意:輸入四個座標,8個數,前兩個座標為第一個矩形的對角線的兩個點,後兩個座標為第二個矩形的對角線的兩個點;然後輸出其兩個矩形相交叉的面積;
思路:這個題一開始看起來很麻煩,但當畫出圖來的時候就會發現,只要讓橫座標的第三大的數減去第二大的數在乘上縱座標的第三大的數減去第二大的數(即(x[3]-x[2])*(y[3]-y[2])),即是交叉的面積;不過要特別注意的一點就是要提前判斷上兩個矩形是否 有交叉,有交叉才能這樣計算的!!
反思點:一開始對於沒有交叉的情況忘記考慮,所以說明自己在思考問題的時候還是不夠全面,以後在做題的時候把一些特殊情況,即只要題目中未說不會這樣發生,就去考慮一下這種特殊情況的處理方式!!;
新技巧:這個題目一開始以為會很多情況,不過後來發現有規律可尋,所以在一些計算題的時候,一般都會有一定得規律可尋,不會讓你傻傻的把所以情況全列出來,然後計算的!!;
程式碼:
#include<iostream>
#include<cstring>
#include<iomanip>
using namespace std;
int main()
{
int t,i,j,m,n;
double x[4],y[4],ss,sum;
while(cin >> x[0]){
int tag=1;
cin >> y[0];
for(i=1;i<4;++i){
cin >> x[i] >> y[i];
}
if((x[0]>x[3]&&x[0]>x[2]&&x[1]>x[3]&&x[1]>x[2])||(x[0]<x[3]&&x[0]<x[2]&&x[1]<x[3]&&x[1]<x[2])||(y[0]>y[3]&&y[0]>y[2]&&y[1]>y[3]&&y[1]>y[2])||(y[0]<y[3]&&y[0]<y[2]&&y[1]<y[3]&&y[1]<y[2]))
tag=0;
if(tag)
{
for(i=1;i<4;++i){
for(j=0;j<4-i;++j){
if(x[j]>x[j+1]){
ss=x[j];x[j]=x[j+1];x[j+1]=ss;
}
if(y[j]>y[j+1]){
ss=y[j];y[j]=y[j+1];y[j+1]=ss;
}
}
}
sum=(x[2]-x[1])*(y[2]-y[1]);
}
else sum=0;
cout << fixed;
cout.precision(2);
cout << sum << endl;
}
return 0;
}