一、 實驗題目
• 題目描述:
假設海岸線是一條無限延伸的直線,陸地在海岸線的一側,海洋在另一側。每乙個小島相當於海洋側的乙個點,坐落在海岸線的基站只能覆蓋半徑為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的大矩形,總...