分治 遞迴實現 巨人與鬼

2021-10-24 22:54:48 字數 1329 閱讀 7718

巨人和鬼

一組n個巨人正與n個鬼進行戰鬥,每個巨人的**是乙個質子炮, 它可以把一串質子流射中鬼而把鬼消滅。質子流沿直線行進,在擊中鬼時就終止。巨人決定採取下述策略。他們尋找鬼配對,以形成n個巨人─鬼對,。然後每個巨人同時向他選取的鬼射出一串質子流。我們知道,讓質子流互相交叉是很危險的。因此巨人選擇的配對方式應該使質子流都不會交叉。假定每個巨人和每個鬼的位置都是平面上的乙個固定點,並且沒有三個位置共線, 求一種配對方案。

解題思路:由題意知,其必存在乙個解,這裡利用分治的思想,利用一條線,把原區域分為兩個區域,然後對這兩個區域遞迴求解。

分割思路:

1.先找左下角節點

2.把其餘點按其與左下角節點角度大小排序

3.從小到大遍歷,當一邊的巨人與鬼的數量相同時(這裡利用正負1相加為0判斷),儲存答案,遞迴求解

分割圖如下:

用p1 –p6分割

//只有當c1與c2的數量相等且基點與當前點標識不同時才能配對

ans[ji.biao]

= p[k]

.biao;

go(l +

1, k -1)

;//左半部分

go(k +

1, r)

;//右半部份

}int

main

(void)go

(1, n)

;for

(int i =

1; i <= n; i++

) cout << ans[i]

<<

" ";

}system

("pause");

}原

凸包問題擴充套件 巨人和鬼 分治 遞迴

巨人和鬼 一組n個巨人正與n個鬼進行戰鬥,每個巨人的 是乙個質子炮,它可以把一串質子流射中鬼而把鬼消滅。質子流沿直線行進,在擊中鬼時就終止。巨人決定採取下述策略。他們尋找鬼配對,以形成n個巨人 鬼對,然後每個巨人同時向他選取的鬼射出一串質子流。我們知道,讓質子流互相交叉是很危險的。因此巨人選擇的配對...

UVA1411 Ants 巨人與鬼

uva1411 ants 巨人與鬼 題沒輸出玩,再來一張 翻譯成中文就是 思路 考慮到這道題比較難,就上個思路吧 分治 下面展示一些內聯 片。include include include include include using namespace std const int maxn 505 ...

演算法競賽入門經典 高效演算法 巨人與鬼

巨人與鬼 題目 2 0 0 1 2 2 1 1 4 樣例輸出 有可能有多種匹配方案,只要符合要求即可 0 2 1 3 這一題書上說是分治 遞迴,但是筆者剛開始只是當成數理題做,並沒有意識到其分治的思想,下面的 也是按照筆者最開始的數理方法寫的,分治思想的 之後再補上。1 首先,要如何想到這種極座標的...