一条直线上N个线段所覆盖的总长度
生活随笔
收集整理的這篇文章主要介紹了
一条直线上N个线段所覆盖的总长度
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉自http://blog.csdn.net/bxyill/article/details/8962832
問題描述:
現有一直線,從原點到無窮大。
這條直線上有N個線段。線段可能相交。
問,N個線段總共覆蓋了多長?(重復覆蓋的地區只計算一次)
================================================
解題思路:
可以將每個線段拆分成“單位1”
遍歷所有線段,使用一個數組記錄每個線段所走過的“單位1”
最后統計數組中被走過的中“單位1”的個數,即是所有線段覆蓋的總長度了。
這里有個問題?數組的大小如何確定?
數組的大小應該是所有線段中最大的端點坐標。
?===============================================
順便想到一個問題。
給出若干個線段。求一共有幾個“連通域”。就是將能合并的線段 合并成一個線段。
最后能合并出幾個來?
利用上面的思想。非常簡單。
只需遍歷單位數組的時候做個開始和結尾的記錄就行了。
程序實現如下。
===============================================
//此題要求 //求出一條直線上所有線段所覆蓋的全程長度是多少。 //重疊的地方只計算一次。 //================================ //本算法的思想是,將每個線段進行像素化, //添加到一個單位數組c[N]中 //遍歷c數組判斷哪些單位被覆蓋到了, //在count計數一下就知道一共覆蓋了多少路程。 //真是巧妙啊。 //============================== #include <iostream> using namespace std; const int N = 10000; //線段結構體 struct Segment {int start;int end; }; // int coverage(Segment *segments, int n) {bool c[N]={false};//每個“單位1”是否被覆蓋到int start=0;int end = 0;//遍歷n個線段for(int i = 0; i < n; i++){for(int j = segments[i].start; j < segments[i].end; j++){c[j] = true;}//尋找最右端if(segments[i].end > end){end = segments[i].end;}//尋找最左端if(segments[i].start < start){start = segments[i].start;}}//從最左端開始到最右端。遍歷單位數組Cint count = 0;for(int i= start; i < end; i++){if(c[i]){int s=i;while(c[i]){count++;i++;}int e=i;cout << "["<<s<<","<<e<<"]"<<endl;}}return count; };int main() {Segment s1;s1.start = 1;s1.end = 3;Segment s2;s2.start = 2;s2.end = 6;Segment s3;s3.start = 11;s3.end = 12;Segment s4;s4.start = 10;s4.end = 13;Segment ss[] = {s1,s2,s3,s4};cout << "歸并后"<<endl;cout <<"被覆蓋總長度:" <<coverage(ss, sizeof(ss)/sizeof(ss[0]))<<endl; }
?
輸出結果如下:
歸并后
[1,6]
[10,13]
被覆蓋總長度
8
請按任意鍵繼續. . .
轉載于:https://www.cnblogs.com/bethunebtj/articles/4884893.html
總結
以上是生活随笔為你收集整理的一条直线上N个线段所覆盖的总长度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《闺怨词三首》第二句是什么
- 下一篇: 不育症有那些症状