Yeecy 程式雜筆

隨意寫寫,看懂掌聲 d(`・∀・)b

0%

UVa 10065: Useless Tile Packers

描述

有一瓦片,形狀為 \(N\)\((3 \leq N \leq 100)\) 組成的簡單多邊形,用來裝該瓦片的容器,形狀為恰好能放入該瓦片的最小凸多邊形,問該瓦片放入容器後,在不考慮厚度的情況下,容器中會有多少百分比的面積浪費。

思路

浪費面積的百分比,為 \({(\text {容器面積} - \text {瓦片面積}) \over \text {容器面積}} \times 100 \%\),因此我們首先需要知道瓦片和容器的面積。

簡單多邊形面積

由於瓦片是由 \(N\) 點組成的簡單多邊形,因此它的面積可以由鞋帶公式(shoelace formula)得到:

\[ {area} = \frac{|{x_1}{y_2} - {x_2}{y_1} + {x_2}{y_3} - {x_3}{y_2} + \dots + {x_{n-1}}{y_{n}} - {x_{n}}{y_{n-1}} + {x_{n}}{y_1} - {x_1}{y_{n}}|}{2} \]

注意到點必須按順時針或逆時針方向排序,若為逆時針,則分子的值為正,若為順時針,則分子的值為負,由於面積非負,所以需要對分子取絕對值。

凸包(convex hull)

現在瓦片的面積已經知道,接下來要找到容器的面積。由於容器的形狀為恰好能放入瓦片的最小凸多邊形,這表示我們需要先尋找 \(N\) 點的凸包,接著算出該凸包的面積。用來尋找凸包的演算法很多,可以參考文末連結,在實作演算法時,由於題目已經提及不會發生三點共線,並且所有點都位於第一象限或 \(+x\) 軸或 \(+y\) 軸上,因此不用顧慮太多。得到凸包後,套用上面的鞋帶公式即可求得面積,不過要注意凸包的點要先排序過,否則結果會是錯誤的。

結論

本題在思路上不算困難,但是要求解題者對上述的演算法有著清晰的理解,不然實作不出來也是白搭。

備註