B - Pentagon / トヨタ自動車プログラミングコンテスト2023#8 (AtCoder Beginner Contest 333)
問題
頂点が時計回りに順に である正五角形 がある。
の2頂点 を結ぶ線分と、2頂点 を結ぶ線分の長さが等しいか判定せよ。
入力
まず最初の1行に、2文字の文字列 が与えられる。
そして次の1行に、2文字の文字列 が与えられる。
条件
- 実行時間制限: 2s
- メモリ制限: 1024MB
- は
A
,B
,C
,D
,E
のいずれかの文字
出力
線分の長さが等しいときは Yes
を、等しくないときは No
を出力すること。
解法
を、点 から点 までをつなぐ辺の本数の最小値として定めます。 ( についても同様です。)
各頂点はアルファベット順に並んでいるため、与えられた2文字がアルファベット順でどれだけ離れているかを考えることで、それぞれまでに辿り着く辺の本数を求めることができます。
ただし、「アルファベット順でどれだけ離れているか」は時計回りで頂点を見たときの辺の本数であるため、最小値にならないときがあります。 「アルファベット順でどれだけ離れているか」を表す整数を とおくと、正五角形について考えているため、 \begin{align} \mathrm{dist} = \min (\mathrm{diff}, 5 - \mathrm{diff}) \end{align} によって が与えられます。
この問題では正多角形について考えているため、 が成立すれば、2つの線分の長さが等しいと判定できます。 逆に、これが成立しないときは、2つの線分の長さは等しくありません。
ソースコード
main()
関数の中に直接答えを出力する部分を実装しました。
int main() { // 文字列の入力 string s, t; cin >> s; cin >> t; // diff は abs(s[0] - s[1]) で求めることができる int dist_s = min(abs(s[0] - s[1]), 5 - abs(s[0] - s[1])); int dist_t = min(abs(t[0] - t[1]), 5 - abs(t[0] - t[1])); // 答えの出力 if (dist_s == dist_t) { Yes(); } else { No(); } return 0; }