ABC051: C - Back and Forth

問題

C: Back and Forth - AtCoder Beginner Contest 051 | AtCoder

解答

1週目は行き帰りで(sx, sy), (tx, ty)に沿ってできる長方形の辺を辿れば最短距離で移動できる。 2週目は長方形の辺をその一回り大きく回るだけで良い。余分な移動数が行き帰り4個ずつで8個出来る。

int main() {
  int sx, sy, tx, ty;
  cin >> sx >> sy >> tx >> ty;
  std::stringstream ss;
  // phase1
  for (int i = sx; i < tx; i++) {
    ss << "R";
  }
  for (int i = sy; i < ty; i++) {
    ss << "U";
  }
  for (int i = sx; i < tx; i++) {
    ss << "L";
  }
  for (int i = sy; i < ty; i++) {
    ss << "D";
  }

  // phase2
  ss << "D";
  for (int i = sx; i < tx + 1; i++) {
    ss << "R";
  }
  for (int i = sy; i < ty + 1; i++) {
    ss << "U";
  }
  ss << "L";

  ss << "U";
  for (int i = sx; i < tx + 1; i++) {
    ss << "L";
  }
  for (int i = sy; i < ty + 1; i++) {
    ss << "D";
  }
  ss << "R";

  std::cout << ss.str() << "\n";
//  std::cout << ss.str().size() << "\n";
//  assert(ss.str().size() == string("UURRURRDDDLLDLLULUUURRURRDDDLLDL").size())
  assert(ss.str().size() == (tx - sx + ty - sy) * 4 + 8);
}