AtCoder が提供しているABC(AtCoder Beginner Contest)364 B問題をC++とPythonで解いてみました。ABC364は、2024年7月27日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 Grid Walk(Difficulty : 79)
問題の詳細は、リンク先をご覧ください。
グリッドの移動を正確に実装するだけです。AtCoder Problems による Difficulty は 79 でした。
解答案
C++ プログラム例(ABC364B)
文字列 $X$ の文字 ‘L’、’R’、’U’、’D’ に従いグリッドの移動をします。移動先がグリッドの範囲内であり、空きマスであることを確認します。
以下が、C++プログラムです。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int h, w;
cin >> h >> w;
int si, sj;
cin >> si >> sj;
--si;
--sj;
vector<string> c(h);
for (int i = 0; i < h; ++i) {
cin >> c[i];
}
string x;
cin >> x;
for (int i = 0; i < x.length(); ++i) {
if (x[i] == 'L') {
if ((sj - 1 >= 0)&&(c[si][sj - 1] == '.')) {
--sj;
}
}
if (x[i] == 'R') {
if ((sj + 1 < w)&&(c[si][sj + 1] == '.')) {
++sj;
}
}
if (x[i] == 'U') {
if ((si - 1 > 0)&&(c[si - 1][sj] == '.')) {
--si;
}
}
if (x[i] == 'D') {
if ((si + 1 < h)&&(c[si + 1][sj] == '.')) {
++si;
}
}
}
cout << si + 1 << " " << sj + 1 << endl;
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC364B)
Python版も基本的な考え方は同じです。以下がプログラムです。
"""AtCoder Beginner Contest 364 B"""
h, w = map(int, input().split())
si, sj = map(int, input().split())
si -= 1
sj -= 1
c = [input() for i in range(h)]
x = input()
for _, ch in enumerate(x):
if ch == 'L':
if sj - 1 >= 0 and c[si][sj - 1] == '.':
sj -= 1
if ch == 'R':
if sj + 1 < w and c[si][sj + 1] == '.':
sj += 1
if ch == 'U':
if si - 1 >= 0 and c[si - 1][sj] == '.':
si -= 1
if ch == 'D':
if si + 1 < h and c[si + 1][sj] == '.':
si += 1
print(si + 1, sj + 1)
こちらも「AC」と判定されました。
最後に
B問題としては、少し長めのプログラムかもしれません。
引き続き ABC の問題を紹介していきます。