最近遇到测试结果区域重叠,如test1=0005.png ,C,1 200, 157 345,520 700. 第一区间和第二区间部分重叠。 参考博客:http://blog.csdn.net/bupt8846/article/details/42738739
#include <vector>
#include <algorithm>
//第一步,这里定义一个类,同时声明了类结构;
class Interval
{
public:
int left, right;
bool isleftclosed, isrightclosed;
Interval(const int &a, const int &b, const bool l, const bool r) :left(a), right(b), isleftclosed(l), isrightclosed(r){}; //新定义的结构体属性; 如[a,b,1,1],(a,b,0,0)
bool operator<(const Interval &a)
{
if (left != a.left)
return left<a.left;
else if (isleftclosed != a.isleftclosed)
return isleftclosed;
else
{
if (right != a.right)
return right<a.right;
else if (isrightclosed != a.isrightclosed)
return isrightclosed;
else
return false;//相等的时候返回假
}
}
};
//第二步,声明区间合并函数。调用这个函数实现,区间合并,且得到的是顺序结果。
vector<Interval> union_intervals(vector<Interval> A)
{
if (A.size() <= 1)
return A;
sort(A.begin(), A.end()); //sort函数的头文件,#include <algorithm>
vector<Interval> res;
Interval cur = A[0];
for (int i = 0; i<A.size(); i++)
{
//两个if语句的逻辑关系要理清楚
if (A[i].left<cur.right || (A[i].left == cur.right && (A[i].isleftclosed || cur.isrightclosed)))
{
if (A[i].right>cur.right || (A[i].right == cur.right && A[i].isrightclosed))//不要忘了!
cur.right = A[i].right;
}
else
{
res.push_back(cur);
cur = A[i];
}
}
res.push_back(cur);//不要忘了!
return res;
}
//第三步,调用上述函数 vector<Interval> union_intervals(vector<Interval> A)实现区间合并。
vector<Interval> A, B;//输入A和输出B
for (int kg = 0; kg < 10; kg++)
{
Interval QA(tempstr[2 * kg], tempstr[2 * kg + 1], 1, 0);//tempstr[]为输入的数据
A.push_back(QA);
}
B = union_intervals(A);
for (int kg = 0; kg < B.size(); kg++)
{
Comtp[2 * kg] = B.at(kg).left;
Comtp[2 * kg + 1] = B.at(kg).right;//Comtp中为合并后的有序区间。
}
vector 类型的数据参考:http://blog.csdn.net/hancunai0017/article/details/7032383
C++ 【对若干个区间进行合并】