演算法實驗 通訊覆蓋

2021-10-07 06:15:40 字數 1825 閱讀 8967

一、 實驗題目

• 題目描述:

假設海岸線是一條無限延伸的直線,陸地在海岸線的一側,海洋在另一側。每乙個小島相當於海洋側的乙個點,坐落在海岸線的基站只能覆蓋半徑為d的範圍。應用直角座標系,將海岸線作為x軸,設海洋在x軸上方。給定海洋中各小島的位置,以及通訊基站的覆蓋半徑,要求用最少的基站覆蓋所有小島,使得每個小島都能和陸地通過某基站通訊。

• 輸入:

小島的數目,基站的覆蓋半徑,各小島的座標(第一行為小島數與通訊半徑,後面各行為小島座標)

• 輸出:

覆蓋小島的最少基站數目及基站座標,如果無解,輸出-1

• 實驗要求:

用貪心演算法解決該問題;

至少執行3組不同的資料。

二、 實驗實現

1. 程式語言:

實驗用c完成演算法設計和程式設計並除錯通過。

2.解題方法:貪心演算法

將小島的x座標按從小到大排序x1d-y1y1),從左到右檢查每個小島,如果小島在該圓的覆蓋範圍內,則檢查下乙個;如果小島不在覆蓋範圍內,則以該點為邊界點做下乙個圓c2。直至所有點都被覆蓋。

證明:先假設小島的座標集合s=已經按x軸從小到大排序。

第一次選取橫座標最小的點作為第乙個圓周上的點,圓心為c1(c1=x1+sqrt(dd-y1y1),0),s』=為去除第乙個圓所包含的點的集合。此時選取x1作為左側圓周上的點,重複上述操作,直到所有的點都在圓中。因為每次選取子問題 的點可以得到最優解o=。

a=1c1,當a2!=c2,將去除集合中的a2換成c2,這樣既能覆蓋點x2,又能覆蓋右邊最多的點,因此選取c2覆蓋的點不會更少,則解不會更差,因此貪心選擇它。

結果截圖

輸入1: 輸入2: 輸入3:

結果1: 結果2: 結果3:

時間複雜度:

演算法執行過程中,只需檢索每個小島,小島檢索完程式也就執行結束,所以時間複雜度為o(n)。

四、源程式

#include

#include

#include

using

namespace std;

int n, num;

double d, len;

struct node

;struct node a[

100]

;double center[

100]

;int f[

100]

;bool

squence

(node a, node b)

void

greedy()

len = a[0]

.x +

sqrt

(double

(d * d)

- a[0]

.y * a[0]

.y);

center[0]

= len;

f[0]=

1;for(

int i =

1; i < n; i++

)elseif(

(a[i]

.x - len)

*(a[i]

.x - len)

+ a[i]

.y * a[i]

.y <= d * d)}}

intmain()

sort

(a, a + n, squence)

; num =1;

greedy()

;printf_s

("%d\n"

, num)

;for

(int i =

0; i < n; i++)}

return0;

}

演算法實驗4 棋盤覆蓋

description 在乙個2k x 2k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。input k,dr,dc。k定...

棋盤覆蓋演算法

在乙個2k 2k個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤,顯然特殊方格在棋盤上出現的位置有4k種情形。因而對任何k 0,有4k種不同的特殊棋盤。特殊方格必位於4個較小子棋盤之一中,其餘3個子棋盤中無特殊方格。為了將這3個無特殊方格的子棋盤轉化為特殊...

矩形覆蓋 演算法

題目描述 我們可以用21的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個21的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?import org.junit.test 題目描述 我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總...