Boot camp for Beginners hard 018【C – Back and Forth 】をpython解説

Boot camp for Beginners hard

Atcoder Problems という競プロを勉強する上でのコンテンツがあります。AtCoder Problems

今回は、hard100問の内、18問目を解説していきたいと思います。

問題名 【C – Back and Forth 】

C – Back and Forth

入力

sx, sy:現在地の座標
tx, ty :目的地の座標

考察

今回、操作では、初期位置(sx,sy)から目的地(tx,ty)を2回往復する問題です。

その中での制約として、同じ道を通ってはいけないが、移動回数を少なくする必要があります。

そこで今回は、

  • 1回目の往復は最短経路
  • 2回目の往路では、(sx,sy)→(sx,sy-1)→(tx+1,ty)→(tx,ty)→(tx,ty+1)→(sx-1,sy)

と大回りの経路を通るようにします。

今回の問題で大事なのは、同じ道を通らない最短経路は2種類しかないということに気づけるかということです。

そして、その条件に気づけてたら、2回目の往復は必然的に最短経路から1マス分膨らんだところを目指す必要があります。

別アプローチ

(tx,ty)までに行き方として、(tx-1,ty),(tx,ty-1),(tx+1),(tx,ty+1)の4つの場所から移動するしかないので、逆に今回の問題ではそれらの4つの行き方を網羅する必要がある事がわかる

コード

import sys
def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def II(): return int(sys.stdin.readline())
def MI(): return map(int,sys.stdin.readline().rstrip().split())
def S(): return sys.stdin.readline().rstrip()
readline = sys.stdin.readline
sys.setrecursionlimit(10 ** 6)


sx,sy,tx,ty = MI()
first_go = (tx-sx)*"R" + (ty-sy)*"U"
first_come = (tx-sx)*"L" + (ty-sy)*"D"
second_go = "D"+(tx-sx+1)*"R"+(ty-sy+1)*"U"+"L"
second_come ="U"+(tx-sx+1)*"L" + (ty-sy+1)*"D" + "R"
print(first_go+first_come+second_go+second_come)

まとめ

こーゆー問題は、紙に具体的な手順を書くと解けることが多い気がする。

前の問題 017【C – AB Substrings】
次の問題 019【D – Grid Coloring】

コメント

タイトルとURLをコピーしました