🕒 2020/05/02
🔄 2024/10/14
第二回 アルゴリズム実技検定 A - エレベーター 解説
🧦
問題
問題文は本家サイトにあります:第二回 アルゴリズム実技検定 A - エレベーター
問題概要
ある建物には18のフロアがある。フロアは、下から B9, B8, …, B1, 1F, 2F, …, 9F という名前がついている。
隣接する2つのフロア間を移動するのに1秒かかるとき、フロア $S$ からフロア $T$ まで移動するのにかかる最短時間を答えなさい。
制約
$S, T$ は相異なるフロアの名前。
解説
数直線とは異なり、日本でのフロアの表し方には "0" に当たるものがありません。その点に注意して計算しましょう。
1F を基準にした位置を考えることにします。2F なら "+1" で、9F なら "+8" です。また、B1 なら "-1" で、B5 なら "-5" です。こうすれば、大きい方から小さい方を引くと、移動するフロア数が求められます。差の絶対値を計算しても同じ結果になります。
このように、フロア名に対して「1F を基準にした位置」を対応させるには、
- 2文字目が F なら、1文字目から1を引く
- 1文字目が B なら、2文字目にマイナスをつける
とすればいいですね。C++ では次のように書くことができます。
#include <iostream>
using namespace std;
int pos(string X) {
if (X[1] == 'F') return (X[0] - '0') - 1;
else return -1 * (X[1] - '0');
}
int main() {
string S, T; cin >> S >> T;
int s = pos(S), t = pos(T);
cout << abs(s - t);
return 0;
}