題目:
判斷兩個區間是否重疊
思路:
假設區間表示為[start,end],先存在兩個區間A,B.
兩個區間的關系有兩種:重疊與不重疊
重疊的情況有4種,兩種相交,兩種包含(很容易想到,此處不示意)
不重疊有兩種情況:A在B前面,A在B后面
因此很容易得到判斷區間重疊的方法:
1、正向判斷,列出四種重疊的情況,滿足其一,則重疊;
2、逆向判斷,列出兩種不重疊的情況,如果滿足其一,則重疊;
顯然第二種方法更簡單。
優化正向判斷:
考慮一下正向判斷的四種情況,其實只要滿足max(A.start,B.start)<=min(A.end,B,end),即可判斷A,B重疊。(由於畫圖比較麻煩,這里就不示意,可以在紙上試試)
代碼:
#include <iostream>
using namespace std;
typedef struct{
int start;
int end;
}Interval;
bool isOverlap_1(Interval interval1,Interval interval2){
if(interval1.end<interval2.start || interval1.start>interval2.end)
return false;
return true;
}
bool isOverlap_2(Interval interval1,Interval interval2){
if(max(interval1.start,interval2.start)<=min(interval1.end,interval2.end))
return true;
return false;
}
int main()
{
Interval interval1,interval2;
while(1){
if(cin>>interval1.start && cin>>interval1.end && cin>>interval2.start && cin>>interval2.end){
if(isOverlap_2(interval1,interval2))
cout<<"Overlap"<<endl;
else
cout<<"Non-overlap"<<endl;
}
}
return 0;
}
