給定 n 個圓盤(彩紙),按疊放順序從底到上列出(第一個最底),每個圓盤由圓心坐標 (x, y) 和半徑 r 定義。從頂部觀察,判斷有多少圓盤至少有一部分可見(不被上方圓盤完全覆蓋)。
遞歸/迭代檢查遮擋關係:
dist(center_A, center_B) + r_B <= r_A(即 B 在 A 內部且不相交邊界)。double,比較時允許 1e-12 容差。輸入: 3 0 0 0.5 -0.9 0 1.00000000001 0.9 0 1.00000000001 輸出: 3 解析: 底部小圓半徑 0.5,兩側大圓半徑略大於 1,中心距 0.9,大圓無法完全覆蓋小圓,三者皆可見。
C++/Java 均可輕松實現,關鍵是幾何判斷函數 bool covers(Circle upper, Circle lower)。
博客詳細解析:Viva Confetti 題解