切換
舊版
前往
大廳
主題

ZeroJudge - a672: 00155 - All Squares 解題心得

Not In My Back Yard | 2020-06-29 01:25:49 | 巴幣 0 | 人氣 236

題目連結:


題目大意:
定義一個正方形的大小為 k (1 ≦ k ≦ 512),代表其邊長為 2k + 1 單位長。現在有一個大小為 1024 的正方形區域,也就是邊長為 2049 單位長的區域。其左上角座標為 (0, 0) 、右下角座標為 (2049, 2049) 。

我們將大小為 k 的正方形之中心放在區域的中心。而對於大小 k > 1 的正方形,其四個頂點是另外四個大小為 k ÷ 2 (取整數)的正方形之中心。如下,是一個 k = 15 被放在區域中間會有的樣子:

輸入有多列,每列給定三整數,正方形大小 k 以及一個點的座標 x 、 y (0 ≦ x 、 y ≦ 2049)。將正方形的畫出來後,試問該座標 (x, y) 位於多少個正方形內(若在正方形的邊上也算作在內)?輸出時,必須保留 3 個字元長,並靠右對齊(見範例輸出)。
 


範例輸入:
500 113 941
300 100 200
300 1024 1024
0 0 0


範例輸出:
  5
  0
  1


解題思維:
對於一個大小 k 以及目前正方形中心所在的位置 (Cx, Cy) 。如果給定的座標 (x, y) 滿足:
Cx - k ≦ x ≦ Cx + k 且 Cy - k ≦ y ≦ cy + k
則點 (x, y) 在目前的正方形之內部。而我們可以看到,如果其點處於正方形的中心的左上(或是右上、左下、右下),則其他方向的正方形不需考慮。

對於點位於中心左上,就是不需往右上、左下、右下走,因此我們可以將 Cx 、 Cy 更新成左上的座標 (Cx - k, Cy - k) 並將 k 除以 2 取整,並重複以上步驟直到 k = 1 。

以上過程中,點 (x, y) 在不同迭代的正方形之中之次數即是所求。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作