|
+
|
... |
座標や向きを, 複素数で管理する.
今の向きから, 右を向くには  , 左を向くには  を掛ければよい.
出力の2つ目は, (初期位置からの距離の二乗, y座標, x座標) が辞書順で最も大きくなるような点.
距離そのままでも良いが,
complex<int>
では
abs()
は異なる動きをするので, 距離の二乗である
norm()
を用いる.
壁は, 壁である全ての点を
set<P>
に入れて管理した.
set<P>
を使うため, 比較関数の実装が必要.
ついでに, 出力の2つ目を作るのが楽なように, (y座標, x座標) の辞書順で順序を入れた.
これにより, (初期位置からの距離の二乗, その点) が辞書順で大きいものを選べばよく, ''pair<int, P>'' で管理すると楽になる.
また, ''p(x1, y1)'' と ''q(x2, y2)'' を結ぶ壁は, x座標が区間 ''[min(x1, x2), max(x1, x2)]'', y座標が区間 ''[min(y1, y2), max(y1, y2)]'' に入る点全体である事に注意すると,
x軸に平行か, y軸に平行か, どちらが右/上にあるか等で場合分けせずに済む.
|