第二回 アルゴリズム実技検定 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;
}